Bzoj 2705: [SDOI2012]Longge的问题 欧拉函数,数论

时间:2022-06-03 16:02:35

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

round1 day1

题解:

直接欧拉函数即可。。。(注意:不要用线性筛,要用时再算欧拉函数。。。)

 #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 ;
}