2705: [SDOI2012]Longge的问题
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 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 long
LL 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;
}