gcd求和的几种方法

本文深入探讨了数论在算法优化中的应用,特别是在求解最大公约数、欧拉函数和莫比乌斯函数相关问题时的高效算法。通过不同规模的数据输入,展示了如何运用数学性质和分块技巧降低时间复杂度,适用于竞赛编程和高性能计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最大公约数 : Greatest Common Divisor, 简称 : gcd
定义符号 : d|nd|n: n%d=0n%d=0
定义函数 : φ(n)φ(n): 欧拉函数
定义函数 : μ(n)μ(n): 莫比乌斯函数


一维形式: i=1ngcd(n,i)∑i=1ngcd(n,i)

1. 1n1061≤n≤106

相信大家都会

for(int i=1;i<=n;++i)
    ans+=gcd(n,i);

2. 1n1091≤n≤109

设: gcd(n,i)=dgcd(n,i)=d
显然: n%d=0n%d=0
原问题转换为:
d|ndi=1n[gcd(n,i)=d]∑d|nd⋅∑i=1n[gcd(n,i)=d]
d|ndi=1nd[gcd(nd,i)=1]∑d|nd⋅∑i=1nd[gcd(nd,i)=1]
d|ndφ(nd)∑d|nd⋅φ(nd)
O(n)O(n)枚举nn的因子, 再O(nd)计算φ(nd)φ(nd)就好了


3. 1n10121≤n≤1012

不难发现d|ndφ(nd)∑d|nd⋅φ(nd)是狄利克雷卷积形式
f(n)=nf(n)=nφ(n)φ(n)均为积性函数

所以g(n)=d|ndφ(nd)g(n)=∑d|nd⋅φ(nd)为积性函数
若: n=pe11pe22pekkp1,p2,,pkn=p1e1⋅p2e2⋯pkekp1,p2,⋯,pk均为质数

那么: g(n)=g(pe11)g(pe22)××g(pekk)g(n)=g(p1e1)⋅g(p2e2)×⋯×g(pkek)

考虑: g(pk)=d|pkdφ(pkd)pg(pk)=∑d|pkd⋅φ(pkd)p为质数
即: g(pk)=i=0kpkiφ(pi)=i=1kpkiφ(pi)+pkφ(1)g(pk)=∑i=0kpk−i⋅φ(pi)=∑i=1kpk−i⋅φ(pi)+pk⋅φ(1)
g(pk)=pk+i=1kpki(pipi1)=pk+i=1k(pkpk1)g(pk)=pk+∑i=1kpk−i⋅(pi−pi−1)=pk+∑i=1k(pk−pk−1)

g(pk)=(k+1)pkkpk1g(pk)=(k+1)⋅pk−k⋅pk−1

复杂度: O(n)O(n)


二维形式: i=1nj=1mgcd(i,j)∑i=1n∑j=1mgcd(i,j)

1. 1n,m1031≤n,m≤103

相信大家都会

for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
        ans+=gcd(i,j);

2. 1n=m105q1≤n=m≤105q组询问

设: g(n)=i=1ngcd(n,i)g(n)=∑i=1ngcd(n,i)
我们已经可以在O(n)O(n)内得到g(n)g(n)

i=1nj=1ngcd(i,j)=2i=1nj=1igcd(i,j)i=1ngcd(i,i)=2i=1nj=1igcd(i,j)(n+1)n2=2i=1ng(i)(n+1)n2(8)(9)(10)(8)∑i=1n∑j=1ngcd(i,j)=2⋅∑i=1n∑j=1igcd(i,j)−∑i=1ngcd(i,i)(9)=2⋅∑i=1n∑j=1igcd(i,j)−(n+1)⋅n2(10)=2⋅∑i=1ng(i)−(n+1)⋅n2
复杂度: O(nn+q)O(nn+q)


3. 1n=m107q1≤n=m≤107q组询问

解法1:

枚举: gcd(i,j)=d[1,n]gcd(i,j)=d∈[1,n]
原问题转换为:

d=1ndi=1nj=1n[gcd(i,j)=d]∑d=1nd∑i=1n∑j=1n[gcd(i,j)=d]

d=1ndi=1ndj=1nd[gcd(i,j)=1]∑d=1nd∑i=1⌊nd⌋∑j=1⌊nd⌋[gcd(i,j)=1]

设: f(n)=i=1nj=1n[gcd(i,j)=1]f(n)=∑i=1n∑j=1n[gcd(i,j)=1]
设: g(n)=i=1nj=1i[gcd(i,j)=1]=i=1nφ(i)g(n)=∑i=1n∑j=1i[gcd(i,j)=1]=∑i=1nφ(i)
不难发现: f(n)=2g(n)1f(n)=2⋅g(n)−1

d=1ndi=1ndj=1nd[gcd(i,j)=1]=d=1ndf(nd)=d=1nd(2g(nd)1)∑d=1nd∑i=1⌊nd⌋∑j=1⌊nd⌋[gcd(i,j)=1]=∑d=1nd⋅f(⌊nd⌋)=∑d=1nd⋅(2⋅g(⌊nd⌋)−1)

显然: d=1nd(2g(nd)1)∑d=1nd⋅(2⋅g(⌊nd⌋)−1)可以分块

复杂度: O(n+qn)O(n+q⋅n)

解法2:

i=1nj=1ngcd(i,j)=2i=1nj=1igcd(i,j)(n+1)n2∑i=1n∑j=1ngcd(i,j)=2⋅∑i=1n∑j=1igcd(i,j)−(n+1)⋅n2

设: g(n)=i=1nj=1igcd(i,j)=i=1nd|idφ(id)g(n)=∑i=1n∑j=1igcd(i,j)=∑i=1n∑d|id⋅φ(id)

d|ndφ(nd)∑d|nd⋅φ(nd)是积性函数, 可以线性筛, 同时维护它的前缀和就可以O(1)O(1)回答询问

复杂度: O(n+q)O(n+q)


4. 1nm1051≤n≤m≤105

枚举: gcd(i,j)=d[1,n]gcd(i,j)=d∈[1,n]

原问题转换为:
d=1ndi=1nj=1m[gcd(i,j)=d]∑d=1nd∑i=1n∑j=1m[gcd(i,j)=d]

设: g(x)=i=1nj=1m[gcd(i,j)=x]g(x)=∑i=1n∑j=1m[gcd(i,j)=x]

设: f(x)=i=1nj=1m[xgcd(i,j)]=nxmxf(x)=∑i=1n∑j=1m[x|gcd(i,j)]=⌊nx⌋⋅⌊mx⌋

莫比乌斯反演: f(x)=x|dg(d)g(x)=x|dμ(dx)f(d)f(x)=∑x|dg(d)⇒g(x)=∑x|dμ(dx)f(d)

g(x)=x|dμ(dx)ndmdg(x)=∑x|dμ(dx)⋅⌊nd⌋⋅⌊md⌋

d=1ndd|iμ(id)nimi∑d=1nd∑d|iμ(id)⋅⌊ni⌋⋅⌊mi⌋

复杂度: O(nlogn)O(nlogn)


5. 1nm1061≤n≤m≤106

d=1ndi=1nj=1m[gcd(i,j)=d]d=1ndi=1ndj=1md[gcd(i,j)=1]∑d=1nd∑i=1n∑j=1m[gcd(i,j)=d]⇒∑d=1nd∑i=1⌊nd⌋∑j=1⌊md⌋[gcd(i,j)=1]

莫比乌斯反演得: i=1ndj=1md[gcd(i,j)=1]=i=1ndμ(i)ndimdi∑i=1⌊nd⌋∑j=1⌊md⌋[gcd(i,j)=1]=∑i=1⌊nd⌋μ(i)⋅⌊⌊nd⌋i⌋⋅⌊⌊md⌋i⌋

得: d=1ndi=1ndμ(i)ndimdi∑d=1nd∑i=1⌊nd⌋μ(i)⋅⌊⌊nd⌋i⌋⋅⌊⌊md⌋i⌋

令: f(x,y)=i=1xμ(i)xiyif(x,y)=∑i=1xμ(i)⋅⌊xi⌋⋅⌊yi⌋

利用数论分块可以在O(x+y)O(x+y)得到函数值

同样的, 已知f(x,y)f(x,y)的值, d=1ndf(nd,md)∑d=1nd⋅f(⌊nd⌋,⌊md⌋)可以在O(n+m)O(n+m)内得到答案

所以可以分块套分块, 复杂度: O((n+m)2)O((n+m)2)


6. 1nm107q1≤n≤m≤107q组询问

d=1ndi=1ndμ(i)ndimdi=d=1ndi=1ndμ(i)nidmid∑d=1nd∑i=1⌊nd⌋μ(i)⋅⌊⌊nd⌋i⌋⋅⌊⌊md⌋i⌋=∑d=1nd∑i=1⌊nd⌋μ(i)⋅⌊ni⋅d⌋⋅⌊mi⋅d⌋

令: k=idk[1,n]k=i⋅dk∈[1,n]

枚举 kk: k=1nd|kdμ(kd)nkmk=k=1nnkmkd|kdμ(kd)

不难发现: d|kdμ(kd)∑d|kd⋅μ(kd)是狄利克雷卷积形式
f(n)=nf(n)=nμ(n)μ(n)均为积性函数

所以g(n)=d|ndμ(nd)g(n)=∑d|nd⋅μ(nd)为积性函数
若: n=pe11pe22pekkp1,p2,,pkn=p1e1⋅p2e2⋯pkekp1,p2,⋯,pk均为质数

那么: g(n)=g(pe11)g(pe22)××g(pekk)g(n)=g(p1e1)⋅g(p2e2)×⋯×g(pkek)

考虑: g(pk)=d|pkdμ(pkd)pg(pk)=∑d|pkd⋅μ(pkd)p为质数
g(pk)=i=0kpkiμ(pi)=pkpk1=φ(pk)g(pk)=∑i=0kpk−i⋅μ(pi)=pk−pk−1=φ(pk)

所以: g(n)=φ(n)g(n)=φ(n)

k=1nnkmkd|kdμ(kd)=k=1nnkmkφ(k)∑k=1n⌊nk⌋⋅⌊mk⌋∑d|kd⋅μ(kd)=∑k=1n⌊nk⌋⋅⌊mk⌋⋅φ(k)

复杂度: O(n+q(n+m))O(n+q⋅(n+m))


7. 1n=m10111≤n=m≤1011

用杜教筛来求欧拉函数φ(x)φ(x)前缀和s(n)s(n)

s(n)=(n+1)n2i=2ns(ni)s(n)=(n+1)⋅n2−∑i=2ns(⌊ni⌋)

d=1nd(2s(nd)1)∑d=1nd⋅(2⋅s(⌊nd⌋)−1)(3)

k=1nnk2φ(k)∑k=1n⌊nk⌋2⋅φ(k)(6)

复杂度: O(n23)O(n23)


总结:

对于 m=nm=n的情况
我们得到了22个不同的等式:
i=1nj=1ngcd(i,j)={d=1nd(2s(nd)1)(s(n)=i=1nφ(i)) k=1nnk2φ(k)

它们之间是不是有一些联系呢?
d=1nd(2s(nd)1)=(d=1n2ds(nd))(n+1)n2=(d=1n2ds(nd))d=1ns(nd)=d=1n(2d1)s(nd)=d=1n(2d1)i=1ndφ(i)=d=1ni=1nd(2d1)φ(i)=d=1nd|i(2d1)φ(id)=i=1nd|i(2d1)φ(id)=i=1n(f×g)(i)(11)(12)(13)(14)(15)(16)(17)(18)(19)(11)∑d=1nd⋅(2⋅s(⌊nd⌋)−1)(12)=(∑d=1n2⋅d⋅s(⌊nd⌋))−(n+1)⋅n2(13)=(∑d=1n2⋅d⋅s(⌊nd⌋))−∑d=1ns(⌊nd⌋)(14)=∑d=1n(2⋅d−1)⋅s(⌊nd⌋)(15)=∑d=1n(2⋅d−1)∑i=1⌊nd⌋φ(i)(16)=∑d=1n∑i=1⌊nd⌋(2⋅d−1)⋅φ(i)(17)=∑d=1n∑d|i(2⋅d−1)⋅φ(id)(18)=∑i=1n∑d|i(2⋅d−1)⋅φ(id)(19)=∑i=1n(f×g)(i)

其中{f(x)=φ(x)g(x)=2x1{f(x)=φ(x)g(x)=2⋅x−1

k=1nnk2φ(k)=k=1ni=1nk(2i1)φ(k)=k=1nk|i(2ik1)φ(k)=i=1nk|i(2ik1)φ(k)=i=1n(g×f)(i)(20)(21)(22)(23)(24)(20)∑k=1n⌊nk⌋2⋅φ(k)(21)=∑k=1n∑i=1⌊nk⌋(2⋅i−1)⋅φ(k)(22)=∑k=1n∑k|i(2⋅ik−1)⋅φ(k)(23)=∑i=1n∑k|i(2⋅ik−1)⋅φ(k)(24)=∑i=1n(g×f)(i)
所以这两个等式都表达的是同一个狄利克雷卷积的前缀和, 自然也就相等了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值