BZOJ 2226 [Spoj 5971] LCMSum 数论
2017-03-07 22:53
441 查看
题目大意:求
(lcm为最小公倍数)
将lcm转化一下,把常量提到循环外,变为
枚举gcd,将式子化为
这里对循环里面的i乘以d,但对于限制i的条件来说就是除以d
对于里层的sigma求和,可以利用欧拉函数的性质:小于n的质数的和为n*phi(n)/2
答案为
线性预处理O(n),询问O(1)
(lcm为最小公倍数)
将lcm转化一下,把常量提到循环外,变为
枚举gcd,将式子化为
这里对循环里面的i乘以d,但对于限制i的条件来说就是除以d
对于里层的sigma求和,可以利用欧拉函数的性质:小于n的质数的和为n*phi(n)/2
答案为
线性预处理O(n),询问O(1)
#include <cstdio> #include <cmath> #define N 1000000 typedef long long LL; int top,phi[N+5],prime ; bool k[N+5]; LL ans[N+5],sum[N+5]; void init() { phi[1]=sum[1]=1; for(int i=2;i<=N;i++) { if(!k[i]) prime[++top]=i, phi[i]=i-1; sum[i]=((LL)phi[i]*i)/2; for(int j=1;i*prime[j]<=N;j++) { k[prime[j]*i]=true; if(i%prime[j]==0) { phi[prime[j]*i]=phi[i]*prime[j]; break; } phi[prime[j]*i]=phi[i]*(prime[j]-1); } } for(int i=1;i<=N;i++) for(int j=i;j<=N;j+=i) ans[j]+=sum[i]; return ; } int main() { int T; scanf("%d",&T); init(); while(T--) { int n; scanf("%d",&n); printf("%lld\n",ans *n); } return 0; }
相关文章推荐
- BZOJ 2226 [Spoj 5971] LCMSum 最大公约数之和 | 数论
- BZOJ 2226 Spoj 5971 LCMSum 数论
- bzoj 2226: [Spoj 5971] LCMSum 数论
- BZOJ 2226 [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】[Spoj 5971] LCMSum 莫比乌斯反演(欧拉函数?)
- [bzoj2226][Spoj 5971] LCMSum
- bzoj 2226: [Spoj 5971] LCMSum (反演)
- BZOJ 2226: [Spoj 5971] LCMSum(数论+欧拉函数)
- BZOJ2226: [Spoj 5971] LCMSum
- [欧拉函数] BZOJ 2226 [Spoj 5971] LCMSum
- [BZOJ2226][Spoj 5971] LCMSum(莫比乌斯反演)
- bzoj2226 [Spoj 5971] LCMSum(反演(互质数之和的公式))
- bzoj 2226: [Spoj 5971] LCMSum线性筛欧拉函数
- [BZOJ2226][Spoj5971][数论]LCMSum[好题]
- BZOJ2226: [Spoj 5971] LCMSum