Learning:数论(四)莫比乌斯反演(+题集)

7 篇文章 1 订阅
4 篇文章 0 订阅
莫比乌斯函数的定义:

μ ( x ) = { 1 , n = 1 ( − 1 ) k , n = p 1 p 2 . . . p k , 其 中 p 1 , p 2 , . . . , p k 为 互 不 相 同 的 素 数 0 , 其 他 情 况 \mu(x)=\begin{cases} 1,n=1\\ (-1)^k,n=p_1p_2...p_k,其中p_1,p_2,...,p_k为互不相同的素数\\ 0,其他情况 \end{cases} μ(x)=1,n=1(1)k,n=p1p2...pkp1,p2,...,pk0,
自己稍微推一推就可以知道这是一个积性函数。
所以很显然我们可以线性筛 μ \mu μ
由定义得:
μ ( 1 ) = 1 \mu(1)=1 μ(1)=1
μ ( p ) = − 1 \mu(p)=-1 μ(p)=1
μ ( p k ) = 0 ( k > 1 ) \mu(p^k)=0(k>1) μ(pk)=0(k>1)
所以就可以直接筛了,代码如下:

void init(){
    mu[1]=1;
    for(int i=2;i<N;i++){
        if(!vis[i]){
            prm[cnt++]=i;
            mu[i]=-1;
        }
        for(int j=1;j<cnt&&i*prm[j]<N;j++){
            vis[i*prm[j]]=1;
            if(!(i%prm[j])){
                mu[i*prm[j]]=0;
                break;
            }
            mu[i*prm[j]]=-mu[i];
        }
    }
    return;
}
莫比乌斯反演

莫比乌斯反演有一个非常非常非常重要的性质
∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]
怎么证?
我们设 n = ∏ i = 1 k p i α i n=\prod_{i=1}^kp_i^{\alpha_i} n=i=1kpiαi
考虑 n n n的所有因数,他们的素因子都是 p 0 , p 1 , . . . , p k − 1 p_0,p_1,...,p_{k-1} p0,p1,...,pk1中的,而我们会发现只有当因数的所有的素因子次数为 1 1 1时对答案的贡献才不为 0 0 0,所以我们可以认为 n n n的每个对答案的贡献不为 0 0 0因数都是在 p 0 , p 1 , . . . , p k − 1 p_0,p_1,...,p_{k-1} p0,p1,...,pk1中取若干个素数相乘得到的。特殊的,因数1我们可以当做一个素数都不取。
n = 1 n=1 n=1时,显然 原 式 = 1 原式=1 =1
n &gt; 1 n&gt;1 n>1时,
k k k为奇数,
首先易证 C n m = C n n − m C_n^m=C_n^{n-m} Cnm=Cnnm
选奇数个素数相乘得到的因数个数为 C k 1 + C k 3 + . . . + C k k C_k^1+C_k^3+...+C_k^k Ck1+Ck3+...+Ckk,这种因数的函数值为 − 1 -1 1
选偶数个素数相乘得到的因数个数为 C k 0 + C k 2 + . . . + C k k − 1 C_k^0+C_k^2+...+C_k^{k-1} Ck0+Ck2+...+Ckk1,这种因数的函数值为 1 1 1
首先显然 C n m = C n n − m C_n^m=C_n^{n-m} Cnm=Cnnm
所以易证 C k 1 + C k 3 + . . . + C k k = C k 0 + C k 2 + . . . + C k k − 1 C_k^1+C_k^3+...+C_k^k=C_k^0+C_k^2+...+C_k^{k-1} Ck1+Ck3+...+Ckk=Ck0+Ck2+...+Ckk1,所以因数的函数值加起来为 0 0 0
k k k为偶数,
选奇数个素数相乘得到的因数个数为 C k 1 + C k 3 + . . . + C k k − 1 C_k^1+C_k^3+...+C_k^{k-1} Ck1+Ck3+...+Ckk1,这种因数的函数值为 − 1 -1 1
选偶数个素数相乘得到的因数个数为 C k 0 + C k 2 + . . . + C k k C_k^0+C_k^2+...+C_k^k Ck0+Ck2+...+Ckk,这种因数的函数值为 1 1 1
首先显然 C n m = C n − 1 m − 1 + C n − 1 m ( m ̸ = 0 ) , C n 0 = C n − 1 0 C_n^m=C_{n-1}^{m-1}+C_{n-1}^{m}(m\not=0),C_n^0=C_{n-1}^0 Cnm=Cn1m1+Cn1m(m̸=0),Cn0=Cn10
所以 C k 0 + C k 2 + . . . + C k k = C k − 1 0 + C k − 1 1 + C k − 1 2 + . . . + C k − 1 k − 2 + C k − 1 k − 1 = 2 k − 1 C_k^0+C_k^2+...+C_k^k=C_{k-1}^0+C_{k-1}^1+C_{k-1}^2+...+C_{k-1}^{k-2}+C_{k-1}^{k-1}=2^{k-1} Ck0+Ck2+...+Ckk=Ck10+Ck11+Ck12+...+Ck1k2+Ck1k1=2k1
C k 1 + C k 3 + . . . + C k k − 1 = C k 1 + C k 2 + C k 3 + . . . + C k k − ( C k 0 + C k 2 + . . . + C k k ) C_k^1+C_k^3+...+C_k^{k-1}=C_k^1+C_k^2+C_k^3+...+C_k^k-(C_k^0+C_k^2+...+C_k^k) Ck1+Ck3+...+Ckk1=Ck1+Ck2+Ck3+...+Ckk(Ck0+Ck2+...+Ckk)
= 2 k − ( C k 0 + C k 2 + . . . C k k ) = 2 k − 2 k − 1 = 2 k − 1 = C k 0 + C k 2 + . . . C k k =2^k-(C_k^0+C_k^2+...C_k^k)=2^k-2^{k-1}=2^{k-1}=C_k^0+C_k^2+...C_k^k =2k(Ck0+Ck2+...Ckk)=2k2k1=2k1=Ck0+Ck2+...Ckk
所以因数的函数值加起来为 0 0 0
综上, ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]

这个性质有多重要,我们接下来看一道题(前置知识:数论分块):
t ( 1 ≤ t ≤ 10000 ) t(1\leq t\leq10000) t(1t10000)组数据,每组数据给定 n , m , ( 1 ≤ n ≤ m ≤ 1 0 7 ) n,m,(1\leq n\leq m\leq10^7) n,m,(1nm107) ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = 1 ] \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1] i=1nj=1m[gcd(i,j)=1]
O(nm)秒了
我们会发现暴力的时间复杂度是 O ( n m ) O(nm) O(nm),显然会TLE,所以我们考虑优化。
[ g c d ( i , j ) = 1 ] [gcd(i,j)=1] [gcd(i,j)=1]这个式子很神奇?所以就从这里入手。
仔细分析就会发现 [ g c d ( i , j ) = 1 ] = ∑ d ∣ g c d ( i , j ) μ ( d ) [gcd(i,j)=1]=\sum_{d|gcd(i,j)}\mu(d) [gcd(i,j)=1]=dgcd(i,j)μ(d),因为由前面的莫比乌斯函数的性质可得当且仅当 g c d ( i , j ) = 1 gcd(i,j)=1 gcd(i,j)=1时, ∑ d ∣ g c d ( i , j ) μ ( d ) \sum_{d|gcd(i,j)}\mu(d) dgcd(i,j)μ(d)才会等于 1 1 1,否则等于 0 0 0
所以原式就可以变成: ∑ i = 1 n ∑ j = 1 m ∑ d ∣ g c d ( i , j ) μ ( d ) \sum_{i=1}^n\sum_{j=1}^m\sum_{d|gcd(i,j)}\mu(d) i=1nj=1mdgcd(i,j)μ(d)
然后枚举 d d d,此时 i , j i,j i,j就是 d d d的倍数,所以小于 n n n i i i就有 ⌊ n d ⌋ \lfloor\frac{n}{d}\rfloor dn个, j j j同理。所以我们就可以轻松得到: ∑ d = 1 n ⌊ n d ⌋ ⌊ m d ⌋ μ ( d ) \sum_{d=1}^n\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor\mu(d) d=1ndndmμ(d)
线性筛出 μ \mu μ的前缀和,然后数论分块 O ( n + m ) O(\sqrt{n}+\sqrt{m}) O(n +m )求解。
这就是莫比乌斯反演(其实有个公式的,但是用这个公式大部分题目都很难推,所以不如直接用莫比乌斯函数的性质来搞)
莫比乌斯反演只有多推才能熟练,所以
我们继续!

t ( 1 ≤ t ≤ 10000 ) t(1\leq t\leq10000) t(1t10000)组数据,每组数据给定 n , m , k ( 1 ≤ n ≤ m ≤ 1 0 7 ) n,m,k(1\leq n\leq m\leq10^7) n,m,k(1nm107).求: ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = k ] \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k] i=1nj=1m[gcd(i,j)=k](HDU1695数据范围稍有增加)
咋一看和刚刚的怎么长得那么像?
我们会发现只有当 i , j i,j i,j都是 k k k的倍数时,且 g c d ( i k , j k ) = 1 gcd(\frac{i}{k},\frac{j}{k})=1 gcd(ki,kj)=1时才能成立
所以原式转化为 ∑ i = 1 ⌊ n k ⌋ ∑ i = 1 ⌊ m k ⌋ [ g c d ( i , j ) = 1 ] \sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{i=1}^{\lfloor\frac{m}{k}\rfloor}[gcd(i,j)=1] i=1kni=1km[gcd(i,j)=1]
这不就转化为原来的那道题了吗?得到原式等于 ∑ d = 1 ⌊ n k ⌋ ⌊ n d k ⌋ ⌊ m d k ⌋ μ ( d ) \sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\lfloor\frac{n}{dk}\rfloor\lfloor\frac{m}{dk}\rfloor\mu(d) d=1kndkndkmμ(d)
直接数论分块

接着下一题:
t ( 1 ≤ t ≤ 10000 ) t(1\leq t\leq10000) t(1t10000)组数据,每组数据给定 n , m ( 1 ≤ n ≤ m ≤ 1 0 7 ) n,m(1\leq n\leq m\leq10^7) n,m(1nm107) ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) 为 素 数 ] \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)为素数] i=1nj=1m[gcd(i,j)]
(bzoj2820)
咋一看怎么和刚刚的还是那么像?
记素数集为 p r i m e prime prime
所以我们直接枚举素数,得到 ∑ p ∈ p r i m e ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = p ] \sum_{p\in prime}\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=p] pprimei=1nj=1m[gcd(i,j)=p]
由上题可得:原式= ∑ p ∈ p r i m e ∑ d = 1 n p ⌊ n p d ⌋ ⌊ m p d ⌋ μ ( d ) \sum_{p\in prime}\sum_{d=1}^{\frac{n}{p}}\lfloor\frac{n}{pd}\rfloor\lfloor\frac{m}{pd}\rfloor\mu(d) pprimed=1pnpdnpdmμ(d)
然后我们记 k = p d k=pd k=pd,枚举 k k k,得到:
∑ k = 1 n ⌊ n k ⌋ ⌊ m k ⌋ ∑ p ∈ p r i m e , p ∣ k μ ( k p ) \sum_{k=1}^n\lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor\sum_{p\in prime,p|k}\mu(\frac{k}{p}) k=1nknkmpprime,pkμ(pk)
设函数 f ( n ) = ∑ p ∈ p r i m e , p ∣ n μ ( n p ) f(n)=\sum_{p\in prime,p|n}\mu(\frac{n}{p}) f(n)=pprime,pnμ(pn)
所以原式= ∑ k = 1 n ⌊ n k ⌋ ⌊ m k ⌋ f ( k ) \sum_{k=1}^n\lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor f(k) k=1nknkmf(k)
我们可以在线性筛的时候处理 f ( n ) f(n) f(n)
n n n为素数时,显然 f ( n ) = 1 f(n)=1 f(n)=1
n n n为合数时,
p r m [ j ] prm[j] prm[j] n n n的最小素因子(线性筛中当前枚举的素数), i = n p i=\frac{n}{p} i=pn
p r m [ j ] ∣ i prm[j]|i prm[j]i n n n的最小素因子 p r m [ j ] prm[j] prm[j]的次数大于 1 1 1)时,
i i i无多个次数大于1的素因子时,当且仅当 p = p r m [ j ] p=prm[j] p=prm[j] μ ( n p ) ̸ = 0 \mu(\frac{n}{p})\not=0 μ(pn)̸=0,此时 f ( n ) = μ ( n p r m [ j ] ) = μ ( i ) f(n)=\mu(\frac{n}{prm[j]})=\mu(i) f(n)=μ(prm[j]n)=μ(i)
i i i有多个次数大于1的素因子时,无论 p r m [ j ] prm[j] prm[j]等于多少, μ ( n p ) = 0 \mu(\frac{n}{p})=0 μ(pn)=0,又因为易知 μ ( i ) = 0 \mu(i)=0 μ(i)=0,所以 f ( n ) = μ ( n p ) = 0 = μ ( i ) f(n)=\mu(\frac{n}{p})=0=\mu(i) f(n)=μ(pn)=0=μ(i)
所以当 p r m [ j ] ∣ i prm[j]|i prm[j]i f ( n ) = μ ( i ) f(n)=\mu(i) f(n)=μ(i)
p r m [ j ] ̸ ∣ i prm[j]\not|i prm[j]̸i n n n的最小素因子 p r m [ j ] prm[j] prm[j]的次数等于 1 1 1)时,
此时, n n n就比 i i i多了一个素因数 p r m [ j ] prm[j] prm[j],因为
f ( i ) = ∑ p ∣ i , p ∈ p r i m e μ ( i p ) f(i)=\sum_{p|i,p\in prime}\mu(\frac{i}{p}) f(i)=pi,pprimeμ(pi)
f ( n ) = ∑ p ∣ n , p ∈ p r i m e μ ( n p ) = ∑ p ∣ n , p ∈ p r i m e μ ( i ∗ p r m [ j ] p ) f(n)=\sum_{p|n,p\in prime}\mu(\frac{n}{p})=\sum_{p|n,p\in prime}\mu(\frac{i*prm[j]}{p}) f(n)=pn,pprimeμ(pn)=pn,pprimeμ(piprm[j])
因为 i i i不含素因子 p r m [ i ] prm[i] prm[i],所以
μ ( i ∗ p r m [ j ] p ) = − μ ( i p ) \mu(\frac{i*prm[j]}{p})=-\mu(\frac i p) μ(piprm[j])=μ(pi)
又因为 n n n i i i多一个素因子 p r m [ j ] prm[j] prm[j],所以
f ( n ) = − ∑ p ∣ n , p ∈ p r i m e , p ̸ = p r m [ j ] μ ( i p ) + μ ( n p r m [ j ] ) f(n)=-\sum_{p|n,p\in prime,p\not= prm[j]}\mu(\frac{i}{p})+\mu(\frac n{prm[j]}) f(n)=pn,pprime,p̸=prm[j]μ(pi)+μ(prm[j]n)
= μ ( i ) − ∑ p ∣ i , p ∈ p r i m e μ ( i p ) =\mu(i)-\sum_{p|i,p\in prime}\mu(\frac{i}{p}) =μ(i)pi,pprimeμ(pi)
= μ ( i ) − f ( i ) =\mu(i)-f(i) =μ(i)f(i)
这样我们就可以在线性筛的时候预处理 f f f,然后直接数论分块解决。

继续
t ( 1 ≤ t ≤ 1000000 ) t(1\leq t\leq1000000) t(1t1000000)组数据,每组数据给定 n , m , k ( 1 ≤ n ≤ 1 0 7 ) n,m,k(1\leq n\leq10^7) n,m,k(1n107) ∑ i = 1 n g c d ( i , n ) \sum_{i=1}^ngcd(i,n) i=1ngcd(i,n)
前置知识:狄利克雷卷积
首先枚举 g c d ( i , n ) gcd(i,n) gcd(i,n)
∑ d ∣ n d ∑ i = 1 n [ g c d ( i , n ) = d ] \sum_{d|n}d\sum_{i=1}^n[gcd(i,n)=d] dndi=1n[gcd(i,n)=d]
除掉 d d d得到:
∑ d ∣ n d ∑ i = 1 n d [ g c d ( i , n d ) = 1 ] \sum_{d|n}d\sum_{i=1}^{\frac nd}[gcd(i,\frac nd)=1] dndi=1dn[gcd(i,dn)=1]
反演:
∑ d ∣ n d ∑ i = 1 n d ∑ k ∣ i , k ∣ n d μ ( k ) \sum_{d|n}d\sum_{i=1}^{\frac nd}\sum_{k|i,k|\frac nd}\mu(k) dndi=1dnki,kdnμ(k)
枚举 k k k
∑ d ∣ n ∑ k ∣ n d d μ ( k ) n d k \sum_{d|n}\sum_{k|\frac nd}d\mu(k)\frac n{dk} dnkdndμ(k)dkn
我们记 T = d k T=dk T=dk,然后枚举T:
∑ T ∣ n n T ∑ d ∣ T d μ ( T d ) \sum_{T|n}\frac nT\sum_{d|T}d\mu(\frac Td) TnTndTdμ(dT)
g ( n ) = n , f ( n ) = ∑ d ∣ n d μ ( n d ) g(n)=n,f(n)=\sum_{d|n}d\mu(\frac nd) g(n)=n,f(n)=dndμ(dn)
显然 g g g是积性函数
然后我们发现 f f f g g g μ \mu μ的狄利克雷卷积,所以也是积性函数
然后我们发现原式其实也就是 f f f g g g的狄利克雷卷积,所以也是一个积性函数
直接线性筛,然后 O ( 1 ) O(1) O(1)询问。

其实还有一种更简单的做法,需要用到欧拉函数的性质 ∑ d ∣ n ϕ ( d ) = n \sum_{d|n}\phi(d)=n dnϕ(d)=n
利用这个性质我们就可以吧原式转化为:
∑ i = 1 n ∑ d ∣ i , d ∣ n ϕ ( d ) \sum_{i=1}^{n}\sum_{d|i,d|n}\phi(d) i=1ndi,dnϕ(d)
直接枚举 d d d,就可以直接得到
∑ d ∣ n ϕ ( d ) n d \sum_{d|n}\phi(d)\frac nd dnϕ(d)dn
这显然是狄利克雷卷积的形式,是一个积性函数,直接线性筛就OK了。

再看一道题
t ( 1 ≤ t ≤ 10000 ) t(1\leq t\leq10000) t(1t10000)组数据,每组数据给定 n , m , k ( 1 ≤ n ≤ m ≤ 1 0 7 ) n,m,k(1\leq n\leq m\leq10^7) n,m,k(1nm107).求: ∑ i = 1 n ∑ j = 1 m g c d ( i , j ) \sum_{i=1}^n\sum_{j=1}^mgcd(i,j) i=1nj=1mgcd(i,j)
这道题和刚刚有点像?
还是先枚举 g c d ( i , j ) gcd(i,j) gcd(i,j)
∑ d = 1 n d ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = d ] \sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=d] d=1ndi=1nj=1m[gcd(i,j)=d]
通过之前第二题的结论可以得到:
∑ d = 1 n d ∑ k = 1 n ⌊ n d k ⌋ ⌊ m d k ⌋ μ ( k ) \sum_{d=1}^nd\sum_{k=1}^n\lfloor\frac n{dk}\rfloor\lfloor\frac m{dk}\rfloor\mu(k) d=1ndk=1ndkndkmμ(k)
我们令 T = d k T=dk T=dk,然后直接枚举 T T T
∑ T = 1 n ⌊ n T ⌋ ⌊ m T ⌋ ∑ d ∣ T d μ ( T d ) \sum_{T=1}^n\lfloor\frac nT\rfloor\lfloor\frac mT\rfloor\sum_{d|T}d\mu(\frac Td) T=1nTnTmdTdμ(dT)
f ( n ) = ∑ d ∣ T d μ ( T d ) f(n)=\sum_{d|T}d\mu(\frac Td) f(n)=dTdμ(dT),显然是狄利克雷卷积的形式,是一个积性函数,可以直接线性筛。
所以原式可以转化为:
∑ T = 1 n ⌊ n T ⌋ ⌊ m T ⌋ f ( T ) \sum_{T=1}^n\lfloor\frac nT\rfloor\lfloor\frac mT\rfloor f(T) T=1nTnTmf(T)
直接数论分块 O ( n + m ) O(\sqrt n+\sqrt m) O(n +m )
这道题同样也可以用欧拉函数,而且同样简单很多
原式可以直接转化为
∑ i = 1 n ∑ j = 1 m ∑ d ∣ i , d ∣ j ϕ ( d ) \sum_{i=1}^n\sum_{j=1}^m\sum_{d|i,d|j}{\phi(d)} i=1nj=1mdi,djϕ(d)
直接枚举 d d d
∑ d = 1 n ϕ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ \sum_{d=1}^n\phi(d)\lfloor\frac nd\rfloor\lfloor\frac md\rfloor d=1nϕ(d)dndm
然后数论分块就OK了。
就是这么简单。
那干嘛要讲莫比乌斯反演的做法?
练手感…因为很多题都是只能用莫比乌斯反演做的,比如说下一题:
t ( 1 ≤ t ≤ 1000000 ) t(1\leq t\leq1000000) t(1t1000000)组数据,每组数据给定 n , m , k ( 1 ≤ n ≤ 1 0 7 ) n,m,k(1\leq n\leq10^7) n,m,k(1n107) ∑ i = 1 n l c m ( i , n ) \sum_{i=1}^nlcm(i,n) i=1nlcm(i,n)
先讲一种用欧拉函数的 O ( n l o g n ) O(nlogn) O(nlogn)做法(当然在这道题会TLE,但是可以了解一下,这种做法非常神奇)
∑ i = 1 n l c m ( i , n ) \sum_{i=1}^nlcm(i,n) i=1nlcm(i,n)
= n ∑ i = 1 n i g c d ( i , n ) =n\sum_{i=1}^n\frac i{gcd(i,n)} =ni=1ngcd(i,n)i
= n ∑ d ∣ n 1 d ∑ i = 1 n i [ g c d ( i , n ) = d ] =n\sum_{d|n}\frac1d\sum_{i=1}^{n}i[gcd(i,n)=d] =ndnd1i=1ni[gcd(i,n)=d]
= n ∑ d ∣ n 1 d ∑ i = 1 n d i d [ g c d ( i , n d ) = 1 ] =n\sum_{d|n}\frac1d\sum_{i=1}^{\frac nd}id[gcd(i,\frac nd)=1] =ndnd1i=1dnid[gcd(i,dn)=1]
= n ∑ d ∣ n ∑ i = 1 n d i [ g c d ( i , n d ) = 1 ] =n\sum_{d|n}\sum_{i=1}^{\frac nd}i[gcd(i,\frac nd)=1] =ndni=1dni[gcd(i,dn)=1]
= n ∑ d ∣ n d ϕ ( d ) + [ d = 1 ] 2 =n\sum_{d|n}\frac {d\phi(d)+[d=1]}2 =ndn2dϕ(d)+[d=1]
前面几行应该都懂了吧,都做了那么多题了
问题是最后一行…
我们只考虑后面的式子: ∑ i = 1 n d i [ g c d ( i , n d ) = 1 ] \sum_{i=1}^{\frac nd}i[gcd(i,\frac nd)=1] i=1dni[gcd(i,dn)=1]
因为 d d d n n n的因数,所以我们可以用 d d d代替 n d \frac nd dn
∑ i = 1 d i [ g c d ( i , d ) = 1 ] \sum_{i=1}^di[gcd(i,d)=1] i=1di[gcd(i,d)=1]
其实就是求小于等于 d d d d d d互质的数的和
然后我们会发现如果 x ⊥ d ( x &lt; d ) x\perp d(x&lt;d) xd(x<d),那么 ( d − x ) ⊥ d (d-x)\perp d (dx)d
所以我们可以把与 d d d互质的数首尾两两分组,他们的和就是 d d d,然后他们所有的和就是 d ϕ ( d ) 2 \frac{d\phi(d)}2 2dϕ(d),如果 x = d − x x=d-x x=dx也不影响,特判一下d=1的情况就OK了。
然后线性筛出 ϕ \phi ϕ,调和级数时间预处理答案。
但是这道题要 O ( n ) O(n) O(n)才行啊,有更优秀的做法吗?
莫比乌斯反演
∑ i = 1 n l c m ( i , n ) \sum_{i=1}^nlcm(i,n) i=1nlcm(i,n)
= n ∑ i = 1 n i g c d ( i , n ) =n\sum_{i=1}^n\frac i{gcd(i,n)} =ni=1ngcd(i,n)i
= n ∑ d ∣ n 1 d ∑ i = 1 n i [ g c d ( i , n ) = d ] =n\sum_{d|n}\frac1d\sum_{i=1}^{n}i[gcd(i,n)=d] =ndnd1i=1ni[gcd(i,n)=d]
= n ∑ d ∣ n 1 d ∑ i = 1 n d i d [ g c d ( i , n d ) = 1 ] =n\sum_{d|n}\frac1d\sum_{i=1}^{\frac nd}id[gcd(i,\frac nd)=1] =ndnd1i=1dnid[gcd(i,dn)=1]
= n ∑ d ∣ n ∑ i = 1 n d i [ g c d ( i , n d ) = 1 ] =n\sum_{d|n}\sum_{i=1}^{\frac nd}i[gcd(i,\frac nd)=1] =ndni=1dni[gcd(i,dn)=1]
= n ∑ d ∣ n ∑ i = 1 n d i ∑ k ∣ i , k ∣ n d μ ( k ) =n\sum_{d|n}\sum_{i=1}^{\frac nd}i\sum_{k|i,k|\frac nd}\mu(k) =ndni=1dniki,kdnμ(k)
= n ∑ d ∣ n ∑ k ∣ n d μ ( k ) k ∑ i = 1 n d k i =n\sum_{d|n}\sum_{k|\frac nd}\mu(k)k\sum_{i=1}^{\frac n{dk}}i =ndnkdnμ(k)ki=1dkni
= n ∑ k ∣ n μ ( k ) k ∑ d ∣ n k ∑ i = 1 d i =n\sum_{k|n}\mu(k)k\sum_{d|\frac nk}\sum_{i=1}^di =nknμ(k)kdkni=1di
后面那个式子用等差数列求和:
= n ∑ k ∣ n μ ( k ) k ∑ d ∣ n k d ( d + 1 ) 2 =n\sum_{k|n}\mu(k)k\sum_{d|\frac nk}\frac{d(d+1)}{2} =nknμ(k)kdkn2d(d+1)
= n 2 ∑ k ∣ n μ ( k ) k ∑ d ∣ n k ( d 2 + d ) =\frac n2\sum_{k|n}\mu(k)k\sum_{d|\frac nk}(d^2+d) =2nknμ(k)kdkn(d2+d)
我们记 f ( n ) = ∑ k ∣ n μ ( k ) k ∑ d ∣ n k d 2 , g ( n ) = ∑ k ∣ n μ ( k ) k ∑ d ∣ n k d f(n)=\sum_{k|n}\mu(k)k\sum_{d|\frac nk}d^2,g(n)=\sum_{k|n}\mu(k)k\sum_{d|\frac nk}d f(n)=knμ(k)kdknd2,g(n)=knμ(k)kdknd
可以轻松证明这两个都是积性函数,可以线性筛。
然后就OK了。
留一道题给读者思考:
【BZOJ2693】jzptab

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值