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 }

浙公网安备 33010602011771号