bzoj2705
答案就是 ∑ d * phi(n / d) (d | n) 。。没得说。。
1 #include<bits/stdc++.h> 2 #define clr(a,x) memset(a,x,sizeof(a)) 3 #define rep(i,l,r) for(int i=l;i<r;i++) 4 typedef long long ll; 5 using namespace std; 6 ll read() 7 { 8 char c=getchar(); 9 ll ans=0,f=1; 10 while(!isdigit(c)){ 11 if(c=='-') f=-1; 12 c=getchar(); 13 } 14 while(isdigit(c)){ 15 ans=ans*10+c-'0'; 16 c=getchar(); 17 } 18 return ans*f; 19 } 20 const int maxm=70000; 21 int f[maxm]; 22 ll phi(ll x) 23 { 24 ll ans=x,m=ll(sqrt(x)); 25 for(ll i=2;i<=m;i++) 26 if(x%i==0) 27 { 28 ans=ans/i*(i-1); 29 while(x%i==0)x/=i; 30 } 31 if(x>1) ans=ans/x*(x-1); 32 return ans; 33 } 34 int main() 35 { 36 ll n=read(),ans=0; 37 int m=int(sqrt(n)); 38 rep(i,1,m+1){ 39 if(n%i==0){ 40 ans+=i*phi(n/i); 41 if(i*i<=n) ans+=(n/i)*phi(i); 42 } 43 } 44 printf("%lld\n",ans); 45 return 0; 46 }
还有orzlsj的方法:
注意到h(n) = ∑ d * phi(n / d) (d | n) 是狄利克雷卷积的形式, 而且f(x) = x 和 f(x) = phi(x) 都是积性函数, 所以答案h(x) 也是积性函数.
所以h(x) = Π h(p^k) (p 是 x 的质因数)
由phi(p^k) = p^k - p^(k-1), h(p^k) 很好求. 化简一下得到 h(p^k) = (k + 1) * p^k - k * p^(k - 1)
1 #include<bits/stdc++.h> 2 #define clr(a,x) memset(a,x,sizeof(a)) 3 #define rep(i,l,r) for(int i=l;i<r;i++) 4 typedef long long ll; 5 using namespace std; 6 ll read() 7 { 8 char c=getchar(); 9 ll ans=0,f=1; 10 while(!isdigit(c)){ 11 if(c=='-') f=-1; 12 c=getchar(); 13 } 14 while(isdigit(c)){ 15 ans=ans*10+c-'0'; 16 c=getchar(); 17 } 18 return ans*f; 19 } 20 const int maxm=70000; 21 int f[maxm]; 22 ll phi(ll x) 23 { 24 ll ans=x,m=ll(sqrt(x)); 25 for(ll i=2;i<=m;i++) 26 if(x%i==0) 27 { 28 ans=ans/i*(i-1); 29 while(x%i==0)x/=i; 30 } 31 if(x>1) ans=ans/x*(x-1); 32 return ans; 33 } 34 int main() 35 { 36 ll n=read(),ans=1; 37 int m=int(sqrt(n)); 38 rep(i,2,m+1){ 39 if(n%i==0){ 40 int k=0; 41 while(n%i==0){ 42 k++;n/=i; 43 } 44 ans*=(k+1)*pow(i,k)-k*pow(i,k-1); 45 } 46 } 47 if(n!=1) ans*=2*n-1; 48 printf("%lld\n",ans); 49 return 0; 50 }
2705: [SDOI2012]Longge的问题
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1514 Solved: 943
[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。