题意:
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。
现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
思路:
∑gcd(i,N) =∑(d|n,phi(n/d))
->然后枚举每一个n的因子求phi(n/d)就好了,时间复杂度…估计不出来…
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x&(-x))
typedef long long LL;
const int maxn = 100005;
const int inf=(1<<28)-1;
LL get_phi(LL n)
{
LL res=n,m=n;
for(LL i=2;i*i<=m;++i)
if(m%i==0)
{
res=res/i*(i-1);
while(m%i==0) m/=i;
}
if(m>1) res=res/m*(m-1);
return res;
}
int main()
{
LL n;
scanf("%lld",&n);
LL Ans=0;
for(LL i=1;i*i<=n;++i)
if(n%i==0)
{
Ans+=i*get_phi(n/i);
if(i*i!=n) Ans+=(n/i)*get_phi(i);
}
printf("%lld\n",Ans);
return 0;
}