【51NOD 1238】最小公倍数之和 V3
2017-03-13 20:39
337 查看
Description
Ans=∑i=1n∑j=1nlcm(i,j)Solution1
设gd表示gcd(i,j)为d的倍数的i∗j之和,反演过程省略(反演时先除一下,后面可以消掉)
设:Sn=(12∗(n+1)n)2
Ans=∑i=1nμ(i)i2∑d=1⌊ni⌋d∗S⌊nid⌋
用杜教筛做∑xi=1μ(i)i2
∑d=1nd2∑i|dμ(i)=1
这个式子显然是等于1的,
这个还可以转化一下:
∑i=1ni2∑j=1⌊ni⌋μ(j)j2=1
于是
∑i=1nμ(i)i2=1−∑i=2ni2∑j=1⌊ni⌋μ(j)j2
求出这个以后整个用分块搞一波,
发现这个怎么卡都过不了啊QwQ。。。
Solution2
Ans=(2∗∑i=1n∑j=1i−1ijgcd(i,j))+n∗(n+1)/2设ans′=∑ni=1∑i−1j=1ijgcd(i,j)(注意j的范围)
设:Sn=12∗(n+1)n
( 先枚举两个互质的数,再算它们的倍数)(后面有phi的括号是互质的数的和)
ans′=∑i=1ni∗S⌊ni⌋∗(φ(i)∗i∗12)
ans′=∑i=1n12∗S⌊ni⌋∗φ(i)∗i2
用杜教筛求∑xi=1φ(i)∗i2(下面的n和上面的不一样)
∑d=1nd2∑i|dφ(i)
这个式子显然是立方和,
这个还可以转化一下:
∑i=1ni2∑j=1⌊ni⌋φ(j)j2=(Sn)2
于是
∑i=1nφ(i)i2=(Sn)2−∑i=2ni2∑j=1⌊ni⌋φ(j)j2
回到刚才的式子,用分块搞一波即可
复杂度:O(n23)
Code
#include <cstdio> #include <cstdlib> #define fo(i,a,b) for(int i=a;i<=b;i++) #define sqr(q) ((q)*(q)) using namespace std; typedef long long LL; const int N=20000500,mo=1e9+7,M=224737; const LL eni=500000004,sni=166666668; LL n,ans; bool prz[N+10]; int pr[N/2]; int phi[N+10]; int Hx[M+1][2]; int co; int HX(LL q) { int i=q%M; while(Hx[i][0]&&Hx[i][0]!=q)i=(i+1)%M; return i; } LL SM(LL s,LL t) { if((s+t)&1)return (s+t)%mo*(((t-s+1)>>1)%mo)%mo; return ((s+t)>>1)%mo*((t-s+1)%mo)%mo; } LL PF(LL q) { q%=mo; return q*(q+1)%mo*(2*q+1)%mo*sni%mo; } LL Gphi(LL q) { if(q<=N)return phi[q]; int t=HX(q); if(Hx[t][0])return Hx[t][1]; Hx[t][0]=q; LL ans=0; for(LL i=2,nx;i<=q;i=nx+1) { nx=q/(q/i); ans=(ans+(PF(nx)-PF(i-1))*Gphi(q/i))%mo; } q%=mo; return Hx[t][1]=(sqr(SM(1,q))-ans)%mo; } int main() { phi[1]=1; fo(i,2,N) { if(!prz[i])pr[++pr[0]]=i,phi[i]=i-1; fo(j,1,pr[0]) { int t=pr[j]*i; if(t>N)break; prz[t]=1; phi[t]=phi[i]*pr[j]; if(i%pr[j]==0)break; phi[t]=phi[i]*(pr[j]-1); } } fo(i,2,N)phi[i]=((LL)phi[i]*(sqr((LL)i)%mo)%mo+phi[i-1])%mo; scanf("%lld",&n); for(LL i=2,nx;i<=n;i=nx+1) { nx=n/(n/i); ans=(ans+SM(1,n/i)*(Gphi(nx)-Gphi(i-1))%mo*eni%mo)%mo; } printf("%lld\n",((ans*2+SM(1,n))%mo+mo)%mo); return 0; }
相关文章推荐
- 【51Nod 1238】最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】
- [杜教筛] 51Nod 1238 最小公倍数之和 V3
- 51NOD 1238 最小公倍数之和 V3 [杜教筛]
- 51Nod-1238-最小公倍数之和 V3
- [数论][莫比乌斯反演][杜教筛] 51Nod 1238 最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51Nod 最小公倍数之和V3
- 【51nod】1238 最小公倍数之和 V3 杜教筛
- 51 NOD 1238 最小公倍数之和 V3
- 51nod-【1110 距离之和最小 V3】
- 51nod 1222 最小公倍数计数
- 51nod-1110 距离之和最小 V3(中位数)
- 51nod 1227 平均最小公倍数【欧拉函数+杜教筛】
- 51nod-1222-最小公倍数计数
- 51nod 1222 最小公倍数计数【莫比乌斯反演】
- 51Nod-1110-距离之和最小 V3
- 51NOD 1227:平均最小公倍数——题解
- 51nod 1190 最小公倍数之和 V2