- 题目大意
给出一个n,求从1~n中任意两个数互质的对数为多少,(a,b)和(b,a)算两对。
- 解题思路
构造一个欧拉函数的方法,然后用一个数组去存储下标,因为(a,b)和(b,a)算两对,所以每一个都加两倍,但(1,1)很特殊,所以最后减一就行了。
- 代码
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
const int MAX = 600000;
int phi[MAX];
void find()
{
memset(phi, 0, sizeof(phi));
for (int i = 1; i < MAX; i++) phi[i] = i;
for (int i = 2; i < MAX; i++) {
if (phi[i] == i) {
for (int j = i; j < MAX; j += i) {
phi[j] = phi[j] / i * (i - 1);
}
}
}
}
int main()
{
int x;
int q = 600;
find();
phi[1] = 1;
while (q--)
{
cin >> x;
long long sum = 0;
if (x == 0)
break;
for (long long i = 1; i <= x; i++)
{
sum += phi[i];
}
cout << 2*sum-1 << endl;
}
return 0;
}