求约数和

发布时间 2023-09-29 20:45:56作者: 不o凡

推荐视频: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;
}