UVa10820 Send a Table
只有互质的数对才对答案有贡献。
假设有一个数x,和它互质的数的个数就是它的欧拉函数。
1<=x<=n,所以要求欧拉函数前缀和。
把数对前后两个数颠倒,总答案数为前缀和乘2
(1,1)不能颠倒
所以:求出欧拉函数前缀和,乘2,减1,就是答案。
1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 const int mxn=51000; 9 int phi[mxn]; 10 int sum[mxn]; 11 void Euler(){ 12 int i,j; 13 phi[1]=1; 14 for(i=2;i<mxn;i++) 15 if(!phi[i]){ 16 for(j=i;j<mxn;j+=i){ 17 if(!phi[j])phi[j]=j; 18 phi[j]=phi[j]/i*(i-1); 19 } 20 } 21 for(i=1;i<mxn;i++)sum[i]=sum[i-1]+phi[i]; 22 return; 23 } 24 int ans; 25 int n; 26 int main(){ 27 Euler(); 28 while(scanf("%d",&n) && n){ 29 printf("%d\n",2*sum[n]-1); 30 } 31 return 0; 32 }
本文为博主原创文章,转载请注明出处。