问题描述
炫炫学了筛法之后,很想用筛法求欧拉函数。他决定求1到N的所有数的欧拉函数值。
输入格式
输入的第一行包含1个整数n,。
输出格式
输出若干行,每行包含一个整数,第i行表示i的欧拉函数值
样例输入
2
样例输出
1
1
数据规模和约定
n<=500000
#include<iostream>
using namespace std;
int len, primes[5000010], ans[5000010], num[5000010];
void find(int N) {
ans[1] = 1;
for (int i = 2; i <= N; i ++) {
if (num[i] == 0) {
primes[len++] = i;
ans[i] = i - 1;
}
for (int j = 0; j <= N / i; j ++) {
num[primes[j] * i] = 1;
if (i % primes[j] == 0) {
ans[primes[j] * i] = ans[i] * primes[j];
break;
}
ans[primes[j] * i] = ans[i] * (primes[j] - 1);
}
}
for (int i = 1; i <= N; i ++) {
cout << ans[i] << endl;
}
}
int main() {
int N;
cin >> N;
find(N);
return 0;
}
总结:
1,注意数组的大小范围,一开始直接开500000发现小了,又加了一个0
2,primes表示质数,ans表示欧拉函数值,num是确认这个数是否质数,len表示primes长度
3,如果一个数A是质数,那么它的欧拉函数值就等于A-1