[SDOi2012]Longge的问题
题目描述
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
\(\sum_{i=1}^n \gcd(i,n)\)可以写成\(\sum_{i|n}\varphi(i)\frac n i\)
然后暴力算一下就可以通过本题了
(吐槽数据范围\(n\leq 2^{32}\)!!!!)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
int a[100001],tp;
LL res,n,s;
LL phi(LL n)
{
LL res=n;
for(LL i=2;i*i<=n;i++)
{
if(n%i==0) res=res/i*(i-1);
while(n%i==0) n/=i;
}
if(n>1) res=res/n*(n-1);
return res;
}
int main()
{
scanf("%lld",&n);
s=sqrt(n);
for(LL i=1;i<=s;i++) if(n%i==0)
{
res+=(LL)phi(i)*n/i;
if(i*i==n) break;
res+=(LL)phi(n/i)*i;
}
printf("%lld",res);
}