UVA - 10820 - Send a Table(欧拉函数)

题意:1 <= x, y <= n,可以根据 f(x0, y0)得知 f(k * x0, k * y0) ,问最简要得知所有的f(x,y)至少需要统计多少x与y?

可以看出,实质就是与,n以内有多少对互素的元素,利用欧拉函数即可。

 

 1 #include<cstdio>  
 2 #include<cstring>  
 3 #include<cctype>  
 4 #include<cstdlib>  
 5 #include<cmath>  
 6 #include<iostream>  
 7 #include<sstream>  
 8 #include<iterator>  
 9 #include<algorithm>  
10 #include<string>  
11 #include<vector>  
12 #include<set>  
13 #include<map>  
14 #include<deque>  
15 #include<queue>  
16 #include<stack>  
17 #include<list>  
18 typedef long long ll;  
19 typedef unsigned long long llu;  
20 const int MAXN = 100 + 10;  
21 const int MAXT = 50000 + 10;  
22 const int INF = 0x7f7f7f7f;  
23 const double pi = acos(-1.0);  
24 const double EPS = 1e-6;  
25 using namespace std;  
26   
27 int a[MAXT], phi[MAXT];  
28   
29 //欧拉函数打表  
30 void phi_table(){  
31     memset(phi, 0, sizeof phi);  
32     phi[1] = 1;  
33     for(int i = 2; i < MAXT; ++i)  
34         if(!phi[i])  
35             for(int j = i; j < MAXT; j += i){  
36                 if(!phi[j])  phi[j] = j;  
37                 phi[j] = phi[j] / i * (i - 1);  
38             }  
39     for(int i = 3; i < MAXT; ++i)  phi[i] += phi[i - 1];  
40 }  
41   
42 int main(){  
43     phi_table();  
44     int n;  
45     while(scanf("%d", &n) == 1 && n){  
46         if(n == 1)  printf("1\n");  
47         else  printf("%d\n", 2 * phi[n] + 1);  
48     }  
49     return 0;  
50 }  

 

posted @ 2016-10-25 10:56  TianTengtt  阅读(119)  评论(0)    收藏  举报