题目背景
SDOi2012
题目描述
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数 N N N,你需要求出 ∑ i = 1 N gcd ( i , N ) \sum_{i=1}^N\gcd(i, N) ∑i=1Ngcd(i,N)。
输入输出格式
###输入格式:
一个整数,为
N
N
N。
输出格式:
一个整数,为所求的答案。
输入输出样例
输入样例#1:
6
输出样例#1:
15
说明
对于 60 % 60\% 60%的数据, 0 < N ≤ 2 16 0<N\le 2^{16} 0<N≤216
对于 100 % 100\% 100%的数据, 0 < N ≤ 2 32 0<N\le 2^{32} 0<N≤232
#include<cstdio>
typedef long long ll;
ll n,ans;
ll euler(ll num)
{
ll ret=num;
for(ll i=2;i*i<=num;i++)
{
if(num%i==0)ret=ret*(i-1)/i;
while(num%i==0)num/=i;
}
if(num>1)ret=ret*(num-1)/num;
return ret;
}
int main()
{
scanf("%lld",&n);
ll i;
for(i=1;i*i<=n;i++)
if(n%i==0)ans+=euler(i)*n/i+euler(n/i)*i;
if((i-1)*(i-1)==n)ans-=(i-1)*euler(n/(i-1));//漏掉了
printf("%lld\n",ans);
return 0;
}
总结
欧拉函数