题意很简单,理解一下就是输出1 到 n内有多少种两两互质的情况,其中 a 和 b 互质,b 和 a 互质视为不同的情况,很明显就是算欧拉函数。
#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 ", dp[N]); return 0; }