筛素数, 筛欧拉函数, 筛莫比乌斯函数, 筛约数个数。
细节以后补
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iso646.h>
using namespace std;
const int MAXN = 1000 + 10;
int mu[MAXN];
int phi[MAXN];
int fac[MAXN], d[MAXN];
int pri[MAXN], PriCnt;
bool vis[MAXN];
int n;
void linear_sieve() {
phi[1] = 1, mu[1] = 1, fac[1] = 1;
for (int i=2; i<n; ++i) {
if (!vis[i]) {
pri[PriCnt++] = i;
phi[i] = i - 1;
mu[i] = -1;
fac[i] = 2;
d[i] = 1;
}
for (int j=0; j<PriCnt and i*pri[j]<n; ++j) {
vis[i*pri[j]] = 1;
if (i%pri[j] == 0) {
phi[i*pri[j]] = phi[i] * pri[j];
mu[i*pri[j]] = 0;
fac[i*pri[j]] = fac[i]/(d[i]+1) * (d[i]+2);
d[i*pri[j]] = d[i] + 1;
break;
}
phi[i*pri[j]] = phi[i] * (pri[j]-1);
mu[i*pri[j]] = -mu[i];
fac[i*pri[j]] = fac[i] * 2;
d[i*pri[j]] = 1;
}
}
}
int main() {
cin >> n;
linear_sieve();
}