题目描述
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
输入输出格式
输入格式:
一个整数,为N。
输出格式:
一个整数,为所求的答案。
输入输出样例
输入样例#1:
6
输出样例#1:
15
说明
对于60%的数据,0<N<=2^16
对于100%的数据,0<N<=2^32
题解
求所有GCD(i,n)的值
枚举出n的所有因数,设为ai,时间复杂度为O(√n)
GCD(i/ai,n/ai)=1,则转化为求n/ai的欧拉函数
将求出的所有欧拉函数之和作为答案
因为n<=2^31,所以O(n)求欧拉函数也不行
用O(√n)的时间在线求出欧拉函数
Φ=k*(1-1/p1)*(1-1/p2)....(1-1/pk)
p为质因数
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 long long ans,n,m; 8 long long phi(long long x) 9 {int i; 10 long long s=x; 11 int l=sqrt(x); 12 for (i=2;i<=l;i++) 13 { 14 if (x%i==0) 15 { 16 s=s/i*(i-1); 17 while (x%i==0) x=x/i; 18 } 19 } 20 if (x>1) s=s/x*(x-1); 21 return s; 22 } 23 int main() 24 {int i; 25 cin>>n; 26 m=sqrt(n); 27 for (i=1;i<=m;i++) 28 { 29 if (n%i==0) 30 { 31 ans+=i*phi(n/i); 32 if (i*i<n) ans+=(n/i)*phi(i); 33 } 34 } 35 cout<<ans; 36 }