[BZOJ2226][Spoj 5971] LCMSum(莫比乌斯反演)
2017-03-27 18:34
513 查看
题目描述
传送门题解
画一波柿子∑i=1n[i,j]
=∑i=1nni(i,j)
=n∑i=1n∑d=1n[(i,n)=d]id
令i=id
=n∑d|n∑i=1nd[(i,nd)=1]i
利用反演公式[n=1]=∑d|nμ(d)
=n∑d|n∑i=1ndi∑t|(i,nd)μ(t)
=n∑d|n∑t|nd∑i=1nd[t|i]iμ(t)
令s(n)=∑i=1ni=i(i+1)2
n∑d|n∑t|nds(ndt)tμ(t)
设f(n)=∑d|ns(nd)tμ(t)
=n∑d|nf(nd)
令F(n)=∑d|nf(nd)
那么答案就是nF(n)了嘛…
可以发现f和F都可以用埃式筛法筛出来
那么询问就是O(1)的啦…
时间复杂度O(nloglogn+T)
需要注意的是,这个公式:(i,j)=d−>(id,jd)=1条件是d|i且d|j
代码
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; #define N 1000005 #define LL long long int T,n; LL ans; int p ,prime ,mu ; LL f ,F ; void get(int n) { mu[1]=1; for (int i=2;i<=n;++i) { if (!p[i]) { prime[++prime[0]]=i; mu[i]=-1; } for (int j=1;j<=prime[0]&&i*prime[j]<=n;++j) { p[i*prime[j]]=1; if (i%prime[j]==0) { mu[i*prime[j]]=0; break; } else mu[i*prime[j]]=-mu[i]; } } for (int i=1;i<=n;++i) for (int j=i;j<=n;j+=i) f[j]+=(LL)mu[i]*i*(j/i)*(j/i+1)/2; for (int i=1;i<=n;++i) for (int j=i;j<=n;j+=i) F[j]+=f[j/i]; } int main() { get(1000000); scanf("%d",&T); while (T--) { scanf("%d",&n); ans=(LL)F *n; printf("%lld\n",ans); } }
相关文章推荐
- BZOJ 2226: [Spoj 5971] LCMSum( 数论 )
- bzoj2226 [Spoj 5971] LCMSum(反演(互质数之和的公式))
- BZOJ 2226: [Spoj 5971] LCMSum(数论+欧拉函数)
- bzoj 2226: [Spoj 5971] LCMSum线性筛欧拉函数
- [BZOJ2226][SPOJ5971]LCMSum(莫比乌斯反演)
- [BZOJ]2226: [Spoj 5971] LCMSum 欧拉函数(或莫比乌斯反演)
- 【BZOJ2226】[Spoj 5971] LCMSum 莫比乌斯反演(欧拉函数?)
- 【bzoj2226】[Spoj 5971] LCMSum 欧拉函数
- BZOJ2226: [Spoj 5971] LCMSum
- BZOJ 2226 [Spoj 5971] LCMSum 数论
- [bzoj2226][Spoj 5971] LCMSum
- [欧拉函数] BZOJ 2226 [Spoj 5971] LCMSum
- bzoj 2226: [Spoj 5971] LCMSum 数学+欧拉函数
- BZOJ 2226 [Spoj 5971] LCMSum | 数论拆式子
- 【bzoj2226】【spoj5971】【lcmsum】【数论】
- BZOJ 2226 [Spoj 5971] LCMSum 最大公约数之和 | 数论
- bzoj 2226: [Spoj 5971] LCMSum 数论
- 【BZOJ2226】LCM SUM,数论之一维LCM(莫比乌斯反演)
- BZOJ 2226 Spoj 5971 LCMSum 数论
- BZOJ 2226 【SPOJ 5971】 LCMSum