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
",2*sum[n]-1);
30     }
31     return 0;
32 }
原文地址:https://www.cnblogs.com/SilverNebula/p/5894679.html