いくつかの定義
- 算術関数:正の整数の関数としてのドメイン。
- 乗法関数:を満足\(F(a)のF( B)= F(AB)\(GCD(A、B)= 1)\) 演算機能。
- 可積分ふるい:リニア未満乗法機能とプレフィックスアルゴリズム素敵な時間を得ました。
いくつかの乗法機能
- \(\ varphi(X-)\) :オイラー機能。
- \(\ MU(X-)\) :メビウス関数。
- \(\イプシロン(X-)\) :メタ関数。\(\イプシロン(X)= \ X1} {\ delta_time_unit_address) 。
- \(D(X)\) :約対数関数。\(D(X)= \ sum_ {D | X}。1 \) 。
- \(\ Sigma社(X-)\) :数および機能に関する。\(\シグマ(X)= \ sum_ {D | D} X \) 。
- \(I(X-)\) :アイデンティティ機能。\(I(X)= 1 \) 。
- \(上記ID(X-)が挙げ\) :単位機能。\(上記ID(X-)がX- \ =)を。
ディリクレ畳み込み
- 二つの演算機能\(F(x)は、G (X)\) ディリクレ畳み込みは以下のように定義される:\(F * G = \ sum_ {D |} N-F(D)G(\のNd FRAC)\ )。
- 明らかに、ディリクレ畳み込みは可換連想、分配法則です。そして、我々は簡単にプロパティを見つけることができます:2つの乗法関数のディリクレ畳み込みはまだ乗法関数です。
ドゥは、ふるいを教えます
アルゴリズムのプロセス
- 集合\(S(N)= \ sum_ = {I}。1 ^ NF(I)\) 。私たちは、必要と\(S(N-)を\) 。
- さらに乗法機能を備えた\(G \) 、設定された\(F * G = H \)がある:。\ [\ sum_ {I} 1 ^ = NH(I)= \ sum_ = {I} 1 ^ N \ sum_ {D | I } F(D)G(\ FRAC番号)= \ sum_ {D = 1} ^ NG(D)\ sum_ {i = 1} ^ {\ lfloorの\のFRAC ND \ rfloor} F (I)= \ sum_ {D = 1} ^ NG(D)S(\ lfloorの\のFRAC ND \ rfloor)\]
- 因此、\(G(1)〜S(N)= \ sum_ {i = 1} ^ NH(I) - \ sum_ {D = 2} ^ NG(D)S(\ lfloorの\のFRAC ND \ rfloor)\)。
- 以下のため\(G \)乗法関数であり、\は、(G(1)。1 = \) 、そう\(S(N)\)右式に等しいです。
- 以下のために\(\ H SUM(I)\) 、我々は速い(通常は必要な時間を超えていないそのアルゴリズムを求める必要があります\(O(\ sqrtのN-)\)被減数のため、我々は最初のブロックをすることができます。)その後、再帰的なソリューション\(S(\ lfloor \ FRACのNd \ rfloor)\) 。以下のため\(C {FRAC AB&\ rfloor \ \ lfloor} \ lfloorの\のFRAC \ rfloor = \ lfloor FRAC A {BC} \ \ rfloor \) 、我々はカウント\を(S(x)は\)満たさなければならない(Xが\を= \ lfloor \ FRACのNd \ rfloor(IN D \ [1、N-])\)は、2つのバケット(いずれかを使用することが可能である\(≤\ SQRT N \)、1 \(> \ SQRTをN \)コースはまたのバレル)のメモリを合成することができます。
- 宇宙複雑さは明らかである(\)O(\ sqrtのN-)\。
- 時間は、に見出すことができる\(X = \ lfloor \ FRACの NDの\のrfloor([1、N])\中のd \) のみ\(O(\ SQRT N) \) 値の種類、及びその一度カウントされもはや(のメモリ)を忘れてはいけません。したがって、\(T(N)= \ sum_。1 = {I} ^ {\のSQRT} N-O(\ SQRT I)+ O(\ SQRT {\ lfloor \ FRACのNiの\ rfloor})\) 。定積分、グランス・見つけること\(Tを(N)= O(N ^ {\} 34であるFRAC)\) 。換言すれば、我々は、おそらくあまりにも追い出すことができる\(N = 10 ^ {10 } \) データが、\(N = 10 ^ {11 } \) 場合、ビット神秘。
簡単な例
T1
- 求\(S(N)= \ sum_ {i = 1} ^ n個の\ミュー(I)\) 。
- 我々はことを知っています\(\ MUが\) :自然があり、\(\ * MU I = \イプシロン\) 。得られた、直接式を設定することができる:\(S(N)= 1- \ sum_ {D}は2 ^ナノ秒(\ lfloor \ FRACのNd \ rfloorを)= \) 。
T2
- 定義\(F(N)= N- \ varphi(N-)\)を探している、\(S(N)= \ sum_ = {I}。1 ^ NF(I)を\) 。
- セット\(H = F * ID \) 、見つかった\({D |} H(N)= \ sum_ N-N- \ varphi(D)= N-2 ^ \) 。その後:\(S(N)= \ {N-FRAC(N + 1)(2N + 1)。。} -6- \ sum_ {D} = 2 ^ NDS(\ lfloorの\のFRACのNd \ rfloor)\) 。
- 実際には、被験体が必要とされる\((S(N)= \ sum_ = {I}。1 ^ NF(I))^ 2 \) 。
- わずかに式を押し、\(S(N)= \ sum_ 1} ^ {N-I = \ sum_ {D | D}。。私は\ MU(D)= \ sum_ 1} ^ {D =のNd \ MU(D) \ lfloor FRACのNd \ \ rfloor \) 。後ろ\(\ lfloor \ FRAC ND \ rfloor \)を処理するためにブロックに分割することができ、今はわずか数を扱っている\(S(X)= \ sum_ {D = 1} ^ XD \ MU(D)\) のみ(これらの\(X \)もある(N- \)\来るの数で割り切れます)。
- これは、ボリューム上に残っている\(IDの\) \、(| \イプシロン(N-)\ = N-N- \のMU(D)H(N)= \ sum_ {D}) 。その後:\(S(N)= 1- \ sum_ {D} = 2 ^ NDS(\ lfloorの\のFRACのNd \ rfloor)\) 。
#include <cmath>
#include <cstdio>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int M=1e5,N=2e5,mo=1e9+7;
int n,k,s[N],S;
bool v[N];
int C(int x) {return x<=k?M+x:n/x;}
int P(int&x,int y) {x=(1ll*x+y)%mo;}
void gets(int x)
{
v[C(x)]=s[C(x)]=1;
for(int i,l=2,r; l<=x; l=r+1)
{
r=x/(i=x/l);
if(!v[C(i)]) gets(i);
P(s[C(x)],mo-1ll*(l+r)*(r-l+1)/2%mo*s[C(i)]%mo);
}
}
int main()
{
scanf("%d",&n), k=sqrt(n);
gets(n);
for(int i,l=1,r; l<=n; l=r+1)
{
r=n/(i=n/l);
P(S,1ll*i*(1ll*mo+s[C(r)]-s[C(l-1)])%mo);
}
printf("%lld",1ll*S*S%mo);
}
min25画面