推荐视频:517 筛法求约数和
这个比较简单,若想来点挑战,请点开这个:P2424 约数和
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1e8 + 10;
int p[N], cnt;
int f[N];//d[i]记录i的约数的和
int g[N];//g[i]记录1+p^1+p^2+...+p^s
bool vis[N];
void get_f(int n) {//筛法求约数的个数
g[1] =f[1]= 1;
for (int i = 2; i <= n; i++) {
if (!vis[i]) {
p[++cnt] = i;
g[i] = f[i] = i + 1;//i是质数则等于i+1
}
for (int j = 1; 1LL * i * p[j]<=n; j++) {
int m = i * p[j];
vis[m]=1;
if (i % p[j] == 0) {
g[m] = g[i] * p[j] + 1;
f[m] = f[i] / g[i] * g[m];
break;
}
else {//若i不能被p[j]整除
g[m] = 1 + p[j];
f[m] = g[m] * f[i];
}
}
}
}
int main() {
int n;
cin >> n;
get_f(n);
cout << f[12];
return 0;
}