2705: [SDOI2012]Longge的问题
Time Limit: 3 Sec Memory Limit: 128 MB
Submit: 1959 Solved: 1229
[Submit][Status][Discuss]
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
Input
一个整数,为N。
Output
一个整数,为所求的答案。
Sample Input
6
Sample Output
15
HINT
【数据范围】
对于60%的数据,0<N<=2^16。
对于100%的数据,0<N<=2^32。
Source
题解:
直接欧拉函数即可。。。(注意:不要用线性筛,要用时再算欧拉函数。。。)
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL lys,ys[],n;
void getys()
{
LL nn=(LL)sqrt(n),i;
lys=;
for(i=;i<=nn;i++)
{
if(n%i==)
{
ys[++lys]=i;
if(i*i!=n)ys[++lys]=n/i;
}
}
}
LL phi(LL k)
{
LL kk=(LL)sqrt(k),k1=k,i;
for(i=;i<=kk;i++)
{
if(k1%i==)
{
k=(k/i)*(i-);
while(k1%i==)k1/=i;
}
}
if(k1!=)k=(k/k1)*(k1-);
return k;
}
int main()
{
LL k,i;
LL ans;
scanf("%lld",&n);
getys();
ans=;
for(i=;i<=lys;i++)
{
if(n%ys[i]==)
{
k=n/ys[i];
ans+=(LL)phi(k)*ys[i];
}
}
printf("%lld",ans);
return ;
}