bzoj 2705: [SDOI2012]Longge的问题——欧拉定理
生活随笔
收集整理的這篇文章主要介紹了
bzoj 2705: [SDOI2012]Longge的问题——欧拉定理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
Longge的數學成績非常好,并且他非常樂于挑戰高難度的數學問題。現在問題來了:給定一個整數N,你需要求出∑gcd(i, N)(1<=i <=N)。Input
一個整數,為N。Output
一個整數,為所求的答案。Sample Input
6Sample Output
15HINT
?
【數據范圍】
對于60%的數據,0<N<=2^16。
對于100%的數據,0<N<=2^32。
———————————————————————
這道題如果一個數x gcd(n,x)==y 那么gcd(b/y,x/y)==1
所以我們枚舉因數d 求一下1-n/d有多少個數和n/d的gcd為1 這個可以用歐拉函數
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long const int M=1e3+7; LL read(){LL ans=0,f=1,c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}return ans*f; } LL n,v,ans; int p[M],cnt; LL f(LL x){for(int i=1;i<=cnt;i++)if(x%p[i]==0) x=x/p[i]*(p[i]-1); return x;} int main(){n=read(); v=n;for(LL x=2;x*x<=v;x++)if(v%x==0){p[++cnt]=x;while(v%x==0) v/=x;}if(v!=1) p[++cnt]=v;for(LL x=1;x*x<=n;x++)if(n%x==0){LL y=n/x;ans=ans+y*f(x);if(x!=y) ans=ans+x*f(y);}printf("%lld\n",ans);return 0; } View Code?
轉載于:https://www.cnblogs.com/lyzuikeai/p/7664991.html
總結
以上是生活随笔為你收集整理的bzoj 2705: [SDOI2012]Longge的问题——欧拉定理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 064web
- 下一篇: Springboot如何利用http请求