注释加了 第二层for循环那边 线性筛是不需要j<cnt的 为什么筛法求约数和不加j<cnt就过不了 有什么不一样吗
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include<cstdio>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int d[N], a[N], p[N];
int cnt; bool vis[N];
void get_d(int n) {
d[1] = 1;
for (int i = 2; i <= n; i++) {
if (!vis[i]) {
p[cnt++] = i;
a[i] = 1;
d[i] = 2;
}
//为什么要加j<cnt
for (int j = 0;j<cnt&& p[j] <= n / i; j++) {
int m = i * p[j];
vis[m] = 1;
if (i % p[j] == 0) {
a[m] = a[i] + 1;
d[m] = d[i] / a[m] * (a[m] + 1);
}
else {
a[m] = 1;
d[m] = d[i] * 2;
}
}
}
}
int main() {
int n;
scanf("%d", &n);
get_d(n);
LL sum = 0;
for (int i = 1; i <= n; i++) {
sum += d[i];
}
printf("%lld", sum);
return 0;
}