【SPOJ】【P5971】【LCM Sum】【题解】【数论】
2014-10-20 09:47
295 查看
传送门:http://www.spoj.com/problems/LCMSUM/
ans=n*(gx1)=n/2*((id*phi)x1+1)
g是指1..n中与n互质的数的和
Code:
ans=n*(gx1)=n/2*((id*phi)x1+1)
g是指1..n中与n互质的数的和
Code:
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int getint(){ int res=0;char c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c))res=res*10+c-'0',c=getchar(); return res; } typedef long long LL; const int maxn=1e6+5; bool p[maxn]; int prime[maxn]; int phi[maxn]; LL sum[maxn]; LL anss[maxn]; void getphi(){ phi[1]=1; for(int i=2;i<maxn;i++){ if(!p[i]){ prime[++prime[0]]=i; phi[i]=i-1; }for(int j=1;i*prime[j]<maxn&&j<=prime[0];j++){ p[i*prime[j]]=1; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; }else phi[i*prime[j]]=phi[i]*(prime[j]-1); } }for(int i=1;i<maxn;i++)sum[i]=(LL)i*phi[i]; for(int i=1;i<maxn;i++) for(int j=i;j<maxn;j+=i) anss[j]+=sum[i]; } int main(){ int T=getint(); getphi(); while(T--){ int n=getint(); LL ans=(anss +1)*n/2; printf("%lld\n",ans); } return 0; }
相关文章推荐
- BZOJ 2226: [Spoj 5971] LCMSum(数论+欧拉函数)
- SPOJ LCMSUM (数论)
- BZOJ 2226: [Spoj 5971] LCMSum( 数论 )
- SPOJ LCMSUM (数论)
- SPOJ:SUM OF PRODUCT(数论)
- uva 10791 Minimum Sum LCM(数论)
- SPOJ LCM Sum(积性函数递推+预处理)
- UVa 10791 - Minimum Sum LCM (数论 推理)
- SPOJ (BNUOJ) LCM Sum
- 【bzoj2226】【spoj5971】【lcmsum】【数论】
- UVA - 10791 - Minimum Sum LCM (数论相关!)
- spoj LCMSUM
- 【数论】Minimum Sum LCM, UVa10791【唯一分解定理】【素数筛法】
- BZOJ2226 & SPOJ5971:LCMSum——题解
- bzoj2226 [Spoj 5971] LCMSum(反演(互质数之和的公式))
- bzoj 2226: [Spoj 5971] LCMSum线性筛欧拉函数
- Uva10791 Minimum Sum LCM(数论、唯一分解定理)
- SPOJ LCMSUM&GCDEX
- [BZOJ2226][Spoj 5971] LCMSum(莫比乌斯反演)
- UVA 10791 Minimum Sum LCM (数论)