bzoj 2705: [SDOI2012]Longge的问题(欧拉函数)

来源:互联网 发布:linux string 编辑:程序博客网 时间:2024/06/05 05:26

2705: [SDOI2012]Longge的问题

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 3077  Solved: 1914
[Submit][Status][Discuss]

Description

Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。

Input

一个整数,为N。

Output

一个整数,为所求的答案。

Sample Input

6

Sample Output

15


题目中求∑Gcd(i, n)

因为n过大所以没法暴力,但是Gcd(i, n)的取值一定只可能是n的因数,所以可以暴力n的因数,然后判断这个因数总共出现多少次

假设Gcd(i, n)==k,那么显然Gcd(i/k, n/k)==1,所以只要求出与n/k互质的有多少个数就好了,即求出ϕ(n/k)

欧拉函数:http://blog.csdn.net/jaihk662/article/details/72668327

最后全部加在一起

#include<stdio.h>#define LL long longLL Phi(LL x){LL i, now = x;for(i=2;i*i<=x;i++){if(x%i==0){now = now/i*(i-1);while(x%i==0)x /= i;}}if(x>1)now = now/x*(x-1);return now;}int main(void){LL n, i, ans;while(scanf("%lld", &n)!=EOF){ans = 0;for(i=1;i*i<=n;i++){if(n%i==0)ans += i*Phi(n/i);if(n%i==0 && i*i<n)ans += n/i*Phi(i);}printf("%lld\n", ans);}return 0;}


原创粉丝点击