乗法機能:
乗法関数で定義され、[OK]
乗法関数を指すすべての素数整数\(A \)と\(B \)特性を有する\(F(AB)= F ()は、f(B)\) 数論的関数
約数関数?
メビウス関数\(\ MU \) OK
\ [\ Iファイ(I)= \開始{ケース} 1、&I == 1 \\(-1)^ K、&== \ prod_ ^ {K} {P_I ^ 1 {P {iは1 =}そうでない場合}、P_Iすべての素因数\\ 0、&\端{ケース} \]
なぜ乗法関数はありますか?
いずれかのための\(A、B、GCD(A、B)= 1 \) 、\(AB&\)に割り当てることができる漏れない素因数の組の\(B \)品質係数のセットの
カテゴリー話し合う、定義を満たします
オイラー関数\(\ファイ\) OK
少ない\(N- \)と数\(N- \)素数の数
式:
\ [\ファイ(N)= N * \ prod_ 1 = {I} ^ {K}(\ FRAC {} {P_I} -1- 1)\\ \。]
式の意義:彼はむしろ、打ち上げ撥水性を行うための能力、すべてのスクリーニング\(N- \)要因を
なぜ乗法関数はありますか?
いずれかのための\(A、B、GCD(A、B)= 1 \) 、\(A、B \)は無同じを含む(P \)\式が証明されて直接に、
とにかく、オイラーの機能についての何かは式のように見つめていました
電源機能\(同上\) OK
\(id_k(N)= N ^ K \)
\(ID(N)= ID_1(N)= N \)
明らかに乗法機能
ユニットの機能\(\イプシロン\) OK
\(\イプシロン(N)= [N = 1] \)
明らかに乗法機能
リニアふるいです
コア:Aにそれぞれ番号が唯一の彼の最年少素数のふるいであることを保証するために、
int tot;
bool vis[MAXN];
int p[MAXN], phi[MAXN], mu[MAXN];
void filter()
{
phi[1] = mu[1] = 1;
for (int i = 2; i <= n; ++ i)
{
if (!vis[i]) p[++ tot] = i, phi[i] = i - 1, mu[i] = -1;
for (int j = 1; j <= tot && i * p[j] <= n; ++ j)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
phi[i * p[j]] = phi[i] * p[j]; mu[i * p[j]] = 0;
//没有增加质因子, 结合phi的通式可得
break;
}
else
{
phi[i * p[j]] = phi[i] * phi[p[j]];
mu[i * p[j]] = -mu[i];
}
}
printf("%d %d\n", mu[i], phi[i]);
}
}
ディリクレ畳み込み
\ [(* G F)(N)= \ sum_ {D | N} F(D)G(\ FRAC {n}は{D})\]
可換\(F * G = G *
F \) 連想\((F * G)*
H = F *(G * H)\) 分配プロパティ\(F *(G + H )= F * G + F * H \)
単位素子\(F *ε= F \ )
場合(F、G \)\乗法関数があり、その後、(*、G \ F)\も乗法関数であります
証明:
いずれかのための\(A、B、GCD(A、B)= 1 \) 、\(AB&\)に割り当てることができる漏れない素因数の組の\(B \)品質係数のセットの
\(()* G F(AB)= \ sum_ {D | AB} F(D)G(\ FRAC {AB} {D})\)
セット\(D = D_A * D_B \) 、\(D_A、D_B \)それぞれによって(B \)\因子組成物、明らかにユニークな方法を構成し、\(D \)が一意に分解、D_A(\ D_B \)
\ [\ {整列}(F * G開始)(AB&)&= \ sum_ {D_A | A、D_B | B} F(D_A)F(D_B)G(\ FRAC {A} {D_A}) G(\ FRAC {B} { D_B})\\&= \ sum_ {D_A |、D_B | B} F(D_A)G(\ FRAC {} {D_A})* F(D_B)G(\ FRAC {B} {D_B})\\ &=(* G F)()*(* G F)(B)\端{整列} \]
既知の\(F、G \) 、\(O(N-nlog_2 ^)\)を探している\((\)* G F )
for (int i = 1; i * i <= n; ++ i)
{
(f*g)[i*j] += f[i] * g[i];
for (int j = i + 1; i * j <= n; ++ j)
(f*g)[i*j] += f[i] * g[j] + f[j] * g[i];
}
許可しません
共通関数数論
\(\シグマ(N)\ ) の整数である(N \)\のため数の全ておよび
\(\タウ(N)\ ) の整数を表す\(N- \)ための数の全ての数
\(同上(I)= I \)
そして、いくつかの前述の乗法機能
一般的なディリクレ畳み込みとその証明
\(\イプシロン= \ M * 1 \)
証明:
\(N- \)同じ品質係数の複数を含むか、または\(= 1 \)は、明らかに確立されています
検討\(N-P_2 = P_1 * ... * P_K \) 、\(P_I \)別の素因数である
{整列} \開始\ [\ \ MU |&= \ sum_ {N D}イプシロン(n)を(D)\\&= \ sum_ {i = 1} ^ {K} \ binom {K} {I} *( - 1)^ K \\ \端{整列} \]
ための((X + Y)= K ^ \ ^ IY ^ X SUM {Kiを} * \ Binom {K} I {} \)\、に\(X = -1、Y = 1 \) 、港に
\ [\ {整列} \イプシロン(n)を開始&= \ sum_ ^ {K} 0 ^ K {iは1 =} \\&= \ {ケース} 1を開始し、及びk = 0 \ので\ n = 1で\ \ 0、・そうでなければ\端{ケース} \端{整列} \]
\(\シグマ=同上* 1 \)
\(\タウ= 1 * 1 \)
明確な
\(\ファイ= \ミュー*同上\)
证明:
\ [\ PHI(N)\ {整列}始める&= \ sum_ {D | N} \ MU(d)のID(\ FRAC {n}は{D})\\&= 1 \ CDOT N + \ sum_ {D = \ PRODのP} \ MU(d)のID(\ FRAC {n}は{D})+ 0 \ CDOT(...)\\&= N + \ sum_ {I = 1} ^ {K}( -1)^ K * N * \ FRAC {1} {\ PROD {P}} \\&= N * \ prod_ {I = 1} ^ {K}(1- \ FRAC {1} {P_I})\端{整列} \]
\(\ PHI * 1 =同上\)
上部と両側式を乗算する(\ 1)\
メビウスプレイヴァン
定理:\(\イプシロン= \ MU * 1 \)
関数場合\(F、G \)を満足
\(F(N)= \
sum_ {D | n}はG(D)\) 次に
\(G(N)= \ sum_ {D | N} \ MU(D) F(\ FRAC {n}は{ D})= \ sum_ {D | N} \ミュー(\ FRAC {n}は{D})F(D)\)
証明:$
\(= G \ F = G * 1 \ longleftrightarrow \ミュー* F) $
左側は、同じタイプを乗じ\(\ MU \)右式が乗算されると、(1 \)\
共通:
このコンボリューションの使用:
\(\イプシロン= \ * 1 MU \。)すなわち、\(\ sum_ {D | N } \ MU(D)= 1 \)
\([\ GCD(i、j)は== 1] = \ sum_ {K | \ GCD(I、J)} \ MU(K)\)
例:
NOI2015寿司
BZOJ1257:CQOI2007の数の合計よりももっと
問題の意味:
\(N-、K(\ ^ LE10 9)\) 、シーク(\ \ sum_ {i = 1 } ^ {n}は(K \ MOD I)\)
ゾル:
\(\ sum_ {i = 1} ^ {n}は(K \ MOD I)= \ sum_ {I = 1} ^ {n}は(K - K / Iは* I)= NK - \ sum_ {I = 1} ^ {n}は(K / I)* I \)
BZOJ1101:POI2007Zap
\(T \)基は、尋ねた\(1≤T、N-、M、D≤50000 \)
\ [\ sum_。1} = {X} ^ {N- \ sum_ 1} = {Y {M} ^ [\ GCD (X、Y)= D]
\] に相当するシーク
\ [\ sum_ {X = 1 } ^ {N / D} \ sum_ {Y = 1} ^ {M / D} [\ GCD(X、Y)= 1] \] \(\イプシロンは= \ MU * 1 \) 、即ち、シーク\ [\開始{整列}& = \ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ {M} \ sum_ {D | GCD(I 、J)} \ MU(D)\\&= \ sum_を{I = 1} ^ {N} \ sum_ {J = 1} ^ {M} \ sum_ {D | I、 D | J} \ MU(D )\\&= \ sum_d \ MU(D)\ lfloor \ FRAC {n}は{D} \ rfloor \ lfloor \ FRAC {M} {D} \ rfloor \端{整列} \ 】分割ブロック\(O(\ SQRT {N })\)
n /= d, m /= d
BZOJ2154:クラッシュデジタル形式
\(1個の\ルN、M \ le10 ^ 7 \)、求
\ [\ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ {M} LCM(I、J)\]
\( I * J = \ GCD(I、J)* LCM(I、J)\)
\ [\ {整列}始める&= \ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ {M } \ FRAC {I * J} {\ GCD(I、J)} \\&= \ sum_ {iが1} ^ {N} \ sum_ {J = 1} ^ {M} \ FRAC {I}を{= \ GCD(I、J)} \ FRAC {J} {\ GCD(I、J)} \ GCD(i、j)は\\&= \ sum_ {G} G \ sum_ {i = 1} ^ {N / G } \ sum_ {J = 1} ^ {M / G} I * jは* [\ GCD(I、J)= 1] \\&= \ sum_ {G} G \ sum_ {I = 1} ^ {N / G} \ sum_ {J = 1} ^ {M / G} I * J * \ sum_ {D | GCD(I、J)} \ MU(D)\\&= \ sum_ {G} G \ sum_ {I = 1} ^ {N / G} \ sum_ {J = 1} ^ {M / G} I * J * \ sum_ {D | I、D | J} \ MU(D)\\&= \ sum_ {G } G \ sum_ {D} \ sum_ {i = 1} ^ {N / GD} \ sum_ {J = 1} ^ {M / GD} I * D * J * D * \ MU(D)\\&= \ sum_ {GD} GD \ sum_ {i = 1} ^ {N / GD} \ sum_ {J = 1} ^ {M / GD} I * J * D * \ MU(D)\\ \端{整列} \]
セット\(P = G * D \)
\ [\開始{整列}&= \ sum_ {P} P * \ sum_ {D | P} D * \ MU(D)\ sum_ {I = 1} ^ {N- / P} \ sum_ {J = 1} ^ {M / P} IJ \端{整列} \]
上、及び次いで行う方法?
:Xyyxyyxは叔父前記({D |} D P * \ MU(D)* P \ F(P)= \ sum_)が\乗法関数です。
なぜ?
セット\(A、B、GCD(A、B)= 1、D = DA * DB、DA。| A、DB | B \)
\ [F(Abを&)= \ sum_ {DA | A、DB | B} DA * \ムー(DA)*デシベル
* \ムー(デシベル)* * B \] だけでなく、その後、\(O(N)\)画面?そして暴力\(O(N)\)答えを求めていますか?
観察\(F(I)\)式、線形画面が適用しました:
- \(i\)为质数: \(F(i)=(1*\mu(1)+i*\mu(i))*i\)
- これはアウト素数の篩あり(P [J] \)\画面に\(I * P [j]が \を)
- \(I \モッズP [J]!= 0 \) 、互质!\(F(I * P [J])= F(I)* F(P [J])\)
- \(I \ MOD P [J] == 0 \) 、考慮コントラスト\(F(I)\) 、新たな因子が含まれている必要があります追加され(P ^ 2 \)\、この因子(\ \ MU {} \) 0に等しいです!あまり直接的\(F(I * P [ J])= F(I)* P [J] \)
少ないし、書いた\(MOD \) 、その後、WA、およびTを
ブロック全体の期間間隔が認められた!\((N / P、M / P)\) 定数であり、それがすることが可能である\(F. \)直接加算間隔(プレフィックスと実装)
//空间注意一点
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1e7 + 10;
const LL MOD = 20101009;
int n, m;
LL ans;
int tot;
bool vis[MAXN];
int mu[MAXN], p[664590];
LL f[MAXN];
int sum[MAXN], sumf[MAXN];
void filter()
{
mu[1] = sumf[1] = f[1] = sum[1] = 1;
LL tmp1 = 0;
for (int i = 2; i <= m; ++ i)
{
tmp1 = 1LL * i * (i + 1) / 2 % MOD;
sum[i] = tmp1;
if (!vis[i]) mu[i] = -1, p[++ tot] = i, f[i] = 1LL * (1 + i * mu[i] % MOD + MOD) * i % MOD;
for (int j = 1; j <= tot && i * p[j] <= m; ++ j)
{
vis[i * p[j]] = true;
if (i % p[j] == 0) { mu[i * p[j]] = 0; f[i * p[j]] = f[i] * p[j] % MOD; break; }
else mu[i * p[j]] = -mu[i], f[i * p[j]] = f[i] * f[p[j]] % MOD;
}
sumf[i] = (sumf[i - 1] + f[i]) % MOD;
}
}
int main()
{
scanf("%d%d", &n, &m);
if (n > m) swap(n, m);
filter();
for (int i = 1; i <= n; )
{
int r = min(n, min(n / (n / i), m / (m / i)));
(ans += sum[n / i] % MOD * sum[m / i] % MOD * (sumf[r] - sumf[i - 1] + MOD) % MOD) %= MOD;
i = r + 1;
}
printf("%lld\n", ans);
return 0;
}
PE530:約数のGCD
F(N)は、の和とする最大公約数 Dの及び全ての正の除数オーバーN / Dつまり、n個の、d (F(N)= \ displaystyle \和\ limits_ {D | N} \ \ \テキスト{GCD}(D、\ FRACのND)\)
FはFのsummatory関数、とする(F(K)= \ displaystyle \和\ limits_ {N = 1} ^ K \、F(N)\)\
あなたがいることを与えられている\(F(10)= 32 \)と\(F(1000)= 12776。\)
検索(F(1015)\)\。
回答の質問を提出する
\ [F(N)= \
| {\ GCD(D、\ FRAC {I} {D})} \ {I D} sum_ {i = 1} ^ {N} \ sum_] 列挙に対応し\(I \) 、および\(I \)は、 2つの数の積に分解され、このようなすべてを見つける\(\ GCD \)をし、
列挙された二つの数に相当し、彼らはの製品です\(\ nは-ル\) 、彼らは見つける\(\ GCD \)製品
従って:
\ [\} {始める整列F.(N-)&= \ sum_ {I} 1 = N ^ {} \ sum_ {J} = ^ {N-1 / {I} \ GCD(I、J)} \\。 &= \ sum_gg \ sum_i \ sum_j
[\ GCD(i、j)は== 1] [I * G * J * G \ルN] \エンド] \ {整列} なお、前述のように二人はできない(\ \合計{} \)の上限によって分割される)\(G \
だから、\(I * J \ルのn / gで\)
二つのため\(\和{} \)関連しているが、決定されそうする場合、第二列挙するために、最初は2つの同時列挙に等しい場合にのみ
たとえば、\(I * J \ルN * N / I \) は明らかではありません
続行
[\ \開始{整列} F (N)&= \ sum_gg \ sum_i \ sum_j \ sum_ {D | I、D | J} \ MU(D)* [I * J * G ^ 2 \ルN] \\&= \ sum_gg \ sum_d \
MU(D)\ sum_i \ sum_j [I * J \ル\ FRAC {n}は{G ^ 2 * D ^ 2}] \\ \端{整列} \] 考える\ (G * D \)より何等と一緒に、及びこのカンカン畳み込み
\ [P = GD \\ \ PHI ID(X)* \ミュー(\ FRAC |(X)= \ sum_ {X D} {N} {X})\\
\] 彼らが簡素化となるよう
\ [F(N)= \ sum_p \ PHI(P)* \ sum_i \ sum_j [I * J \ル\ FRAC {N} {P ^ 2}] \]
は何が必要です\(10 ^ {15} \)?スペースを爆破しないのだろうか?
なお、バック\(\ lfloor \ FRAC {P ^ {N-2}} \ rfloor \)に還元することができる(\ \ SQRT {N} \ )
次に列挙\(P \) 、その後のような個々の各要求ブロック
\ [F(N)= \
PHI(P)* \ sum_i \ lfloor \ {n}は{P ^ 2I} FRAC \ rfloor \] それの複雑?前半\(O(\ sqrtの{N-})\)の半分の後、\(O(ln_n)\) ?私は許可しません...
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 32e6 + 10;
const LL MOD = 20101009;
LL n;
LL ans;
int tot;
bool vis[MAXN];
LL p[MAXN], phi[MAXN];
LL f[MAXN];
void filter()
{
phi[1] = 1;
for (int i = 2; i < MAXN; ++ i)
{
if (!vis[i]) p[++ tot] = i, phi[i] = i - 1;
for (int j = 1; j <= tot && i * p[j] < MAXN; ++ j)
{
vis[i * p[j]] = true;
if (i % p[j] == 0) { phi[i * p[j]] = phi[i] * p[j]; break; }
else phi[i * p[j]] = phi[i] * phi[p[j]];;
}
}
}
LL calc(LL x)
{
LL ret = 0;
for (LL i = 1; i <= x; )
{
LL r = min(x / (x / i), x);
ret += (r - i + 1) * (x / i);
i = r + 1;
}
return ret;
}
int main()
{
scanf("%lld", &n);
n = 1e15;
filter();
for (LL i = 1; i * i <= n; ++ i)
{
ans += phi[i] * calc(n / (i * i));
}
printf("%lld\n", ans);
return 0;
}
杜のティーチふるいです
基本的な
目的:シーク\(F(I)\)プレフィックスと
套路:构造\(H = G * F \)
\ [\開始{整列} \ sum_ {i = 1} ^ {n}はH(I)&= \ sum_ {i = 1} ^ {N} \ sum_ { D | I} G(D)* F(\ FRAC {D} {I})\\ \端{整列} \]
即ち列挙二つの要因に等しく、それらが生成物である(\ N-LE \)\、その計算\(G \)をし、\(F \)製品と
\ {整列}始める&[\ = \ sum_ {D = 1} ^ {n}はG( D)\ sum_ {i = 1} ^ {\ lfloor \ FRAC {n}は{D} \ rfloor} F({I})\\ \端{整列} \]
设\(S(N)= \和F(I)\)
\ [\開始{整列} \ sum_ {i = 1からは} ^ {n}はH(I)&= \ sum_ {D = 1} ^ {N } G(D)S(\ lfloor \ FRAC {n}は{D} \ rfloor)\\ \ sum_ {i = 1} ^ {n}はH(I)&= G(1)* S(N)+ \ sum_ {D = 2} ^ {n}はG(D)S(\ lfloor \ FRAC {n}は{D} \ rfloor)\\ G(1)* S(n)が&= \ sum_ {I = 1} ^ {N} H(I) - \ sum_ {D = 2} ^ {n}はG(D)S(\ lfloor \ FRAC {n}は{D} \ rfloor)\\ \端{整列} \]
そうであればCouchu便利として\(H、G \)式の最後の行を適用することができ
\ [G(1)* S(N)= \ sum_ {I = 1} ^ {n}はH(I) - \ sum_ {D = 2} ^ {n}はG(D)S(\ lfloor \ FRAC { n}は{D} \ rfloor)\]
求\(\ sum_ {I = 1} ^ {N} \ MU(I)\)
\(\イプシロン= \ MU * 1、H = \イプシロン、G = 1 \)
\ [S(N)= 1- \ sum_ {I = 2} ^ {n}はS(\ lfloor \ FRAC {n}は{ I} \ rfloor)\]
求\(\sum_{i=1}^{n}\phi(i)\)
\(ID = \ピピ* 1、H = ID、G = 1 \。)
\ [S(N)= \ FRAC {N- *(N + 1)} {2} - \ sum_ ^ {N- {I 2 =} } S(\ lfloor \ FRAC {
n}は{I} \ rfloor)\] の例を見て
例BZOJ3944:合計
\(T(\ル10) \) データのセットは、\(N(\ル31が2 ^は{-1})\) 、シーク(\ \ sum_ {I 1 = ^ {N} \ MUを}(I)、 \ sum_ {I = 1} ^ {N} \ PHI(I)\)
2で行うことができるように、見えた\(\ lfloor \ {N-FRAC {I}} \ rfloor \)ブロックで割り切れます
再帰が、事前スクリーニング、又はますの最初の部分(T \)を\、によるメモリ検索\(マップ\)レコード
#include <cstdio>
#include <map>
using namespace std;
typedef long long LL;
typedef pair<int, LL> PIL;
#define mkpr make_pair
const int MAXN = 5e6 + 2;
inline LL in()
{
LL x = 0, flag = 1; char ch = getchar();
while (ch < '0' || ch > '9') { if (ch == '-') flag = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
return x * flag;
}
int n;
int tot;
bool vis[MAXN];
int p[348516], mu[MAXN]; //348513
LL phi[MAXN];
void filter()
{
phi[1] = mu[1] = 1;
for (int i = 2; i < MAXN; ++ i)
{
if (!vis[i]) { mu[i] = -1, phi[i] = i - 1, p[++ tot] = i; }
for (int j = 1; j <= tot && i * p[j] < MAXN; ++ j)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{ mu[i * p[j]] = 0, phi[i * p[j]] = phi[i] * p[j]; break; }
else
mu[i * p[j]] = -mu[i], phi[i * p[j]] = phi[i] * phi[p[j]];
}
}
for (int i = 2; i < MAXN; ++ i) mu[i] += mu[i - 1], phi[i] += phi[i - 1];
}
map <LL, PIL> f; //92680
PIL solve(LL x) // Smu[x] = 1 - [2, n]Smu[x / i],
{
if (x < MAXN) return mkpr(mu[x], phi[x]);
if (f.count(x)) return f[x];
int mu = 1; LL phi = x * (x + 1) / 2;
for (LL i = 2, nex = i; i <= x; i = nex + 1)
{
nex = x / (x / i);
PIL val = solve(x / i);
mu -= (nex - i + 1) * val.first;
phi -= (nex - i + 1) * val.second;
}
return f[x] = mkpr(mu, phi);
}
int main()
{
filter();
// printf("%d\n", tot);
int Test = in();
while (Test --)
{
n = in();
PIL ans = solve(n);
printf("%lld %d\n", ans.second, ans.first);
}
return 0;
}
複雑
前記前処理を可能にしない\(N ^ {\ FRACを3} {2} {} \)、複雑\(O(N ^ {\ FRAC {2} {3}})\)