UVa 10820 - Send a Table 欧拉函数模板

来源:互联网 发布:域名大全 编辑:程序博客网 时间:2024/05/16 06:52

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=1761


题意很简单,理解一下就是输出1 到 n内有多少种两两互质的情况,其中 a 和 b 互质,b 和 a 互质视为不同的情况,很明显就是算欧拉函数。


#define _CRT_SECURE_NO_WARNINGS#include<cmath>#include<cstdio>#include<memory.h>#include<algorithm>using namespace std;const int MAXN = 50000 + 5;int N;int dp[MAXN];int phi[MAXN];//筛法求 1 - n 内所有数的欧拉函数的值void phiTable(int n){memset(phi, 0, sizeof(phi));phi[1] = 1;for(int i = 2; i < n; ++ i)if(phi[i] == 0)for(int j = i; j < n; j += i){if(phi[j] == 0)phi[j] = j;phi[j] = phi[j] / i * (i - 1);}}void init(){phiTable(MAXN);memset(dp, 0, sizeof(dp));dp[1] = 1;for(int i = 2; i < MAXN; ++ i)dp[i] += dp[i - 1] + (phi[i] << 1);}int main(){init();while(scanf("%d", &N) != EOF && N)printf("%d\n", dp[N]);return 0;}




0 0