求1-n之间互质的对数.
首先打表求出欧拉函数的值,然后直接累加1-n的欧拉函数值*2就是答案,注意n=1的时候要特判下.
#include <cstdio>
using namespace std;
const int MAX = 50001;
int phi[MAX];
int generate_phi(){
for(int i = 0; i < MAX; ++i)phi[i] = 0;
phi[1] = 1;
for(int i = 2; i < MAX; ++i){
if(!phi[i]){
for(int j = i; j < MAX; j += i){
if(!phi[j])phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
}
}
}
int main(){
generate_phi();
int N;
while(scanf("%d", &N) && N){
int ans = 0;
for(int i = 1; i <= N; ++i){
ans += 2 * phi[i];
}
printf("%d\n", ans - 1);
}
return 0;
}