题目大意:给出一个n,求从1~n中任意两个数互质的对数为多少,<a,b>和<b,a>算两对。
解题思路:白书上介绍用nloglogn的算法构造欧拉函数,然后用一个sum数组储存下总值,因为<a,b>和<b,a>算两对,所以每个phi[i]要加两倍,特殊情况<1,1>用初始化sum[1] = 1.
#include <stdio.h>
#include <string.h>
const int N = 50001;
int n, phi[N + 10], sum[N + 10];
void init() {
memset(phi, 0, sizeof(phi));
sum[1] = phi[1] = 1;
for (int i = 2; i <= N; i++) {
if (!phi[i])
for (int j = i; j <= N; j += i) {
if (!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
}
for (int i = 2; i <= N; i++)
sum[i] = sum[i - 1] + (phi[i] << 1);
}
int main() {
init();
while (scanf("%d", &n) && n) {
printf("%d\n", sum[n]);
}
return 0;
}