【bzoj2705】[SDOI2012]Longge的问题 欧拉函数
2017-03-28 12:33
316 查看
题目描述
[align=left]Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。[/align]
输入
[align=left]一个整数,为N。[/align]
输出
[align=left]一个整数,为所求的答案。[/align]
样例输入
6
样例输出
15
题解
欧拉函数
易得知满足gcd(n,x)==i的小于等于n的x的个数为phi(n/i),
并且欧拉函数可以在O(√n)的时间内快速求出。。
于是可以先求出所有n的因子,再用欧拉函数得出答案。
由于因子是成对出现的,所以因子并不需要枚举到n,只需枚举到√n。如果i是n的因子,那么n/i也是n的因子,注意此时i*i==n不能算进答案内。
[align=left]Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。[/align]
输入
[align=left]一个整数,为N。[/align]
输出
[align=left]一个整数,为所求的答案。[/align]
样例输入
6
样例输出
15
题解
欧拉函数
易得知满足gcd(n,x)==i的小于等于n的x的个数为phi(n/i),
并且欧拉函数可以在O(√n)的时间内快速求出。。
于是可以先求出所有n的因子,再用欧拉函数得出答案。
由于因子是成对出现的,所以因子并不需要枚举到n,只需枚举到√n。如果i是n的因子,那么n/i也是n的因子,注意此时i*i==n不能算进答案内。
#include <cstdio> typedef long long ll; ll phi(ll x) { ll ans = x , t = x , i; for(i = 2 ; i * i <= x ; i ++ ) { if(t % i == 0) ans = ans * (i - 1) / i; while(t % i == 0) t /= i; } if(t > 1) ans = ans * (t - 1) / t; return ans; } int main() { ll n , i , ans = 0; scanf("%lld" , &n); for(i = 1 ; i * i <= n ; i ++ ) { if(n % i == 0) { ans += i * phi(n / i); if(i * i < n) ans += (n / i) * phi(i); } } printf("%lld\n" , ans); return 0; }
相关文章推荐
- BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]
- bzoj2705[SDOI2012]Longge的问题 欧拉函数
- BZOJ 2705 SDOI2012 Longge的问题 因数分解+欧拉函数
- 【数论】【枚举约数】【欧拉函数】bzoj2705 [SDOI2012]Longge的问题
- BZOJ2705 [SDOI2012]Longge的问题(欧拉函数)
- BZOJ 2705([SDOI2012]Longge的问题-欧拉函数φ(i))
- 【欧拉函数】BZOJ2705 [SDOI2012]Longge的问题
- 【欧拉函数】BZOJ2705(SDOI2012)[Longge的问题]题解
- 【BZOJ 2705】[SDOI2012]Longge的问题 欧拉函数
- Bzoj 2705: [SDOI2012]Longge的问题 欧拉函数,数论
- BZOJ - 2705: [SDOI2012]Longge的问题 【欧拉函数 一道必做的经典题】
- BZOJ2705 [SDOI2012]Longge的问题 【欧拉函数】
- bzoj 2705 [SDOI2012]Longge的问题 欧拉函数
- bzoj 2705: [SDOI2012]Longge的问题 欧拉函数
- 【BZOJ 2705】【SDOI 2012】Longge的问题【欧拉函数】
- 【bzoj2705】[SDOI2012]Longge的问题 欧拉函数
- bzoj 2705: [SDOI2012]Longge的问题 欧拉函数
- 【欧拉函数】BZOJ2705: [SDOI2012]Longge的问题
- [BZOJ 2705] SDOI 2012 Longge的问题 · 欧拉函数
- [BZOJ2705] [SDOI2012] Longge的问题 - 欧拉函数