积性函数
定义:
如果函数 f : N → R f:N \to R f:N→R满足于任意一对互质的正整数p,q.都有 f ( p q ) = f ( p ) f ( q ) f(pq)=f(p)f(q) f(pq)=f(p)f(q)则称f为积性函数
命题:
如果 f ( n ) f(n) f(n)坏人 g ( n ) g(n) g(n)为积性函数,则 h ( n ) = f ( n ) g ( n ) h(n)=f(n)g(n) h(n)=f(n)g(n)也为积性函数
设f为积性函数,假设 n = p 1 q 1 . . . p k q k n=p_1^{q_1}...p_k^{q_k} n=p1q1...pkqk, f ( n ) = f ( p 1 q 1 ) . . . f ( p k q k ) f(n)=f(p_1^{q_1})...f(p_k^{q_k}) f(n)=f(p1q1)...f(pkqk)
f[1] = 1;
for (int i = 2; i <= n; i++) {
if (!not prime[i]) p[++tot] = i, cnt[i] = 1, f[i] = calc_f(i, 1);
for (int j = 1; j <= tot && i * p[j] <= n; j++) {
not prime[i * p[j]] = 1;
if (i % p[j] == 0) {
cnt[i * p[j]] = cnt[i] + 1;
f[i * p[j]] = f[i]/calc_f(p[j], cnt[i])*calc_f(p[j], cnt[i]+1);
break;
}
cnt[i * p[j]] = 1
f[i * p[j]] = f[i] * calc_f(p[j], 1);
}
}
线性筛求n个数的正因子个数
const int N=10000010,M=N*2,mod=1e9+7;
int n,m,k;
LL Cnt[N],d[N];
bool numlist[N];
int prime[N],cnt;
void Eular(int n=10000000){
Cnt[1]=1;
for(int i=2;i<=n;i++){
if(!numlist[i]){
prime[++cnt]=i;
Cnt[i]=2;
d[i]=1;
}
for(int j=1;prime[j]<=n/i;j++){
numlist[i*prime[j]] =true;
if(i%prime[j]==0){
Cnt[i*prime[j]]=Cnt[i]/(d[i]+1)*(d[i]+2);
d[i*prime[j]]=d[i]+1;
break;
}
d[i*prime[j]]=1;
Cnt[i*prime[j]]=Cnt[i]*Cnt[prime[j]];
}
}
return ;
}
例题
很容易观察出 f ( x ) f(x) f(x)是积性函数,因此我们先预处理出所有的 f r ( 1 − 20 ) f_r(1-20) fr(1−20)因为1e6以内分解质因数后最多的质数的指数为20.然后logn内分解并可以乘得答案。
莫比乌斯反演
作用:
已知 g ( n ) g(n) g(n)的因数和 f ( n ) = ∑ d ∣ n g ( d ) f(n)=\sum_{d|n}g(d) f(n)=∑d∣ng(d),通过f反求g
实际上只要记住如果能够推到成如 f ( n ) = ∑ d ∣ n g ( d ) f(n)=\sum_{d|n}g(d) f(n)=∑d∣ng(d)形式后都能通过反演得到:
g ( n ) = ∑ d ∣ n μ ( n / d ) f ( d ) g(n)=\sum_{d|n} \mu (n/d)f(d) g(n)=d∣n∑μ(n/d)f(d)
其中 μ ( ) \mu() μ()为莫比乌斯函数。
例子 环计数问题
假设 n 个元组成一个环,每个元都是 1*,* 2*, …,*r 中的一个数,两个环是不同的环当且仅当它们不能通过旋转使得两个环中对应的每个元素都相等。求有多少个这样的环。
首先我们构造一个无限长的序列,假设此序列的周期为d,其中d为n的因子。有 r n = ∑ d ∣ n d ∗ f ( d ) r^n=\sum_{d|n}d*f(d) rn=∑d∣nd∗f(d),因此由反演得 f ( n ) = 1 n ∑ d ∣ n μ ( n d ) r d f(n)=\frac{1}{n}\sum_{d|n}\mu(\frac{n}{d})r^d f(n)=n1∑d∣nμ(dn)rd
反演2
设 f : N → R f:N \to R f:N→R, g : N → R g:N \to R g:N→R 是两个函数,且存在正整数N,对于所有n>N, f(n)=g(n)=0,则:
f ( n ) = ∑ n ∣ m g ( m ) f(n)=\sum_{n|m}g(m) f(n)=∑n∣mg(m)等价于 g ( n ) = ∑ n ∣ m μ ( m n ) f ( m ) g(n)=\sum_{n|m}\mu (\frac{m}{n} )f(m) g(n)=∑n∣mμ(nm)f(m)当 m ≤ N m \le N m≤N
例题
两个长度为 n 的序列 a, b,求满足 g c d ( x , y ) = 1 gcd(x, y) = 1 gcd(x,y)=1 且有 a b x = b a y a_{b_x} = b_{a_y} abx=bay的对 (x, y) 的数量。 ( 1 ≤ n ≤ 1 0 5 , 1 ≤ a i , b i ≤ n ) (1 ≤ n ≤ 10^5, 1 ≤ a_i, b_i ≤ n) (1≤n≤105,1≤ai,bi≤n)
令 f ( d ) = ∑ 1 ≤ x , y ≤ n [ a b x = b a y ] [ g c d ( x , y ) = d ] f(d)=\sum_{1\le x,y \le n}[a_{b_x}=b_{a_y}][gcd(x,y)=d] f(d)=∑1≤x,y≤n[abx=bay][gcd(x,y)=d] , g ( d ) = ∑ d ∣ x , d ∣ y [ a b x = b a y ] g(d)=\sum_{d|x,d|y}[a_{b_x}=b_{a_y}] g(d)=∑d∣x,d∣y[abx=bay]
由反演2得: f ( d ) = ∑ d ∣ d ′ g ( d ′ ) μ ( d ′ d ) f(d)=\sum_{d|d'}g(d')\mu (\frac{d'}{d}) f(d)=∑d∣d′g(d′)μ(dd′),因此答案为 f ( 1 ) = ∑ d = 1 n g ( d ) μ ( d ) f(1)=\sum_{d=1}^ng(d)\mu (d) f(1)=∑d=1ng(d)μ(d)
其中g(d)是可以轻松算出来的,总时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
一道非常经典的反演题:
E - Sum of gcd of Tuples (Hard)
一个长度为n的序列 A 1 , . . . A n A_1,...A_n A1,...An,求对于 K N K^N KN种序列的所有 g c d ( A 1 , A 2 . . . A n ) gcd(A_1,A_2...A_n) gcd(A1,A2...An)的和。
a n s = ∑ d = 1 n d ∑ 1 ≤ A i ≤ k [ g c d ( A 1 . . . A n ) ] = d ] ans=\sum_{d=1}^{n}d\sum_{1\le A_i \le k}[gcd(A_1...A_n)]=d] ans=∑d=1nd∑1≤Ai≤k[gcd(A1...An)]=d]
令 f ( d ) = ∑ 1 ≤ A i ≤ k [ g c d ( A 1 , . . . , A n ) = d ] f(d)=\sum_{1 \le A_i \le k}[gcd(A_1,...,A_n)=d] f(d)=∑1≤Ai≤k[gcd(A1,...,An)=d], g ( d ) = ∑ d ∣ d ′ f ( d ′ ) = ⌊ k d ⌋ n g(d)=\sum_{d|d'}f(d')=\lfloor \frac{k}{d} \rfloor ^n g(d)=∑d∣d′f(d′)=⌊dk⌋n
通过反演的第2种形式:
f ( d ) = ∑ d ∣ d ′ g ( d ′ ) μ ( d ′ d ) f(d)=\sum_{d|d'} g(d') \mu(\frac{d'}{d}) f(d)=∑d∣d′g(d′)μ(dd′)
所以最终答案: a n s = ∑ d = 1 n d ⋅ f ( d ) ans=\sum_{d=1}^nd \cdot f(d) ans=∑d=1nd⋅f(d)
= $\sum_{d=1}^n\sum_{d|d’} \lfloor \frac{k}{d’} \rfloor $
= ∑ d ′ = 1 n ∑ d ∣ d ′ d ⋅ μ ( d ′ d ) \sum_{d'=1}^n \sum_{d|d'} d \cdot \mu(\frac{d'}{d}) ∑d′=1n∑d∣d′d⋅μ(dd′)
= ∑ d ′ = 1 n ⌊ k d ′ ⌋ ϕ ( d ′ ) \sum_{d'=1}^n \lfloor \frac{k}{d'} \rfloor \phi(d') ∑d′=1n⌊d′k⌋ϕ(d′)
迪利克雷卷积
定理:
设 f : N → R f:N \to R f:N→R, g : N → R g: N\to R g:N→R是两个函数,则它们的迪利克雷卷积为 ( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( n d ) (f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d}) (f∗g)(n)=∑d∣nf(d)g(dn)
通过迪利克雷卷积可以将莫比乌斯反演写成:
f = g ∗ 1 f=g*1 f=g∗1 <==> g = f ∗ μ g = f*\mu g=f∗μ
一些公式
ϕ ( n ) n = ∑ d ∣ n μ ( d ) n d \frac{\phi(n)}{n}=\sum_{d|n}\mu(d)\frac{n}{d} nϕ(n)=∑d∣nμ(d)dn
应用:快速求 M ( n ) = ∑ i = 1 n μ ( i ) M(n)=\sum_{i=1}^{n}\mu(i) M(n)=∑i=1nμ(i),其中 n ≤ 1 0 11 n \le 10^{11} n≤1011 (杜教筛)
M ( n ) = 1 − ∑ i = 2 n M ( ⌊ n i ⌋ ) M(n)=1-\sum_{i=2}^{n}M(\lfloor \frac{n}{i} \rfloor) M(n)=1−∑i=2nM(⌊in⌋),使用整除分块
广义莫比乌斯反演
设 ( X , ≤ ) (X, \le) (X,≤)是下有限的偏序集, f , g : X → R f,g:X \to R f,g:X→R则 f ( x ) = ∑ y ≤ x g ( y ) f(x)=\sum_{y \le x}g(y) f(x)=∑y≤xg(y)等价于 g ( x ) = ∑ y ≤ x μ ( y , x ) f ( y ) g(x)=\sum_{y \le x}\mu(y,x)f(y) g(x)=∑y≤xμ(y,x)f(y)
其中 μ ( x . y ) \mu(x.y) μ(x.y)满足
f ( x ) = { 1 x = y − ∑ x ≤ z < y μ ( x , y ) x ! = y f(x)=\left\{ \begin{aligned} 1 \qquad x=y\\ -\sum_{x\le z\lt y} \mu(x,y) \qquad x!=y\\ \end{aligned} \right. f(x)=⎩
⎨
⎧1x=y−x≤z<y∑μ(x,y)x!=y