BZOJ 2705: [SDOI2012]Longge的问题
2016-12-23 11:42
246 查看
2705: [SDOI2012]Longge的问题
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2554 Solved: 1566
[Submit][Status][Discuss]
Description
[align=left]Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。[/align]Input
[align=left]一个整数,为N。[/align]Output
[align=left]一个整数,为所求的答案。[/align]Sample Input
6Sample Output
15HINT
【数据范围】对于60%的数据,0<N<=2^16。
对于100%的数据,0<N<=2^32。
Source
round1 day1分析:
继续学数学...如果今天不GG,预计应该是高产的一天...然而题目难度2333...根据Dirichlet卷积:id(i)=i,id=φ×1,(f×g)=Σ(d|n)f(d)*g(n/d)
Σ(1<=i<=n) gcd(i,n)
=Σ(1<=i<=n) id(gcd(i,n))
=Σ(1<=i<=n) Σ(d|gcd(i,n))φ(d)
=Σ(d|n)φ(d)*n/d
代码:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> //by NeighThorn #define int long long using namespace std; //大鹏一日同风起,扶摇直上九万里 int n,m,ans; inline int phi(int x){ int cnt=x; for(int i=2;i<=m;i++) if(x%i==0){ cnt=cnt/i*(i-1); while(x%i==0) x/=i; } if(x>1) cnt=cnt/x*(x-1); return cnt; } signed main(void){ scanf("%lld",&n); m=sqrt(n);ans=0; for(int i=1;i<=m;i++) if(n%i==0){ ans+=phi(i)*n/i; if(n/i>m) ans+=phi(n/i)*i; } printf("%lld\n",ans); return 0; }
View Code
by NeighThorn
相关文章推荐
- [BZOJ2705][SDOI2012]Longge的问题
- bzoj 2705: [SDOI2012]Longge的问题 【欧拉函数求GCD】
- 【数论】【枚举约数】【欧拉函数】bzoj2705 [SDOI2012]Longge的问题
- bzoj2705 [SDOI2012]Longge的问题
- 【SDOI2012】【BZOJ2705】Longge的问题
- BZOJ 2705([SDOI2012]Longge的问题-欧拉函数φ(i))
- 【BZOJ】【2705】【SDOI2012】Longge的问题
- bzoj 2705: [SDOI2012]Longge的问题 歐拉函數
- BZOJ 2705 SDOI2012 Longge的问题 因数分解+欧拉函数
- [欧拉函数]Bzoj2705 Longge的问题[SDOI2012]
- 【bzoj2705】[SDOI2012]Longge的问题 欧拉函数
- BZOJ2705 [SDOI2012]Longge的问题
- BZOJ2705 POJ2480 SDOI2012 Longge的问题
- bzoj2705[SDOI2012]Longge的问题
- 【bzoj2705】【sdoi2012】【longge的问题】【欧拉函数】
- 【SDOI2012】【BZOJ2705】【Longge的问题】【题解】【数论】
- BZOj2705: [SDOI2012]Longge的问题
- BZOJ2705 [SDOI2012]Longge的问题(欧拉函数)
- [BZOJ 2705] SDOI 2012 Longge的问题 · 欧拉函数
- [bzoj 2705][SDOI2012]Longge的问题(数学)