46 lines
1.3 KiB
C++
46 lines
1.3 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
typedef long long LL;
|
||
|
||
const int N = 1e3 + 10;
|
||
|
||
int primes[N], cnt;
|
||
bool st[N];
|
||
|
||
int num[N]; //最小质因子p1组成的等比序列 p1^0+p1^1+...+p1^r1
|
||
int sd[N]; //约数和
|
||
|
||
int n;
|
||
|
||
void get_primes(int n) {
|
||
sd[1] = 1; // 1的约数只有自己,约数和是1
|
||
|
||
for (int i = 2; i <= n; i++) {
|
||
if (!st[i]) {
|
||
primes[cnt++] = i;
|
||
//质数
|
||
sd[i] = num[i] = i + 1; // 1和自身是约数,约数和为i+1; 同时因为i是质数,所以只有一个分拆项,并且分拆项内容=pj^0+pj^1=1+pj=1+i
|
||
}
|
||
for (int j = 0; primes[j] * i <= n; j++) {
|
||
st[i * primes[j]] = true;
|
||
|
||
if (i % primes[j]) {
|
||
sd[i * primes[j]] = sd[i] * sd[primes[j]]; //积性函数
|
||
num[i * primes[j]] = primes[j] + 1;
|
||
} else {
|
||
sd[i * primes[j]] = sd[i] / num[i] * (num[i] * primes[j] + 1);
|
||
num[i * primes[j]] = num[i] * primes[j] + 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
int main() {
|
||
scanf("%d", &n);
|
||
get_primes(n);
|
||
//约数和要不要自己本身,这里是不想要自己本身
|
||
for (int i = 1; i <= n; i++) printf("%d ", sd[i] - i);
|
||
puts("");
|
||
return 0;
|
||
} |