线性筛

线性筛约数个数

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 10000000;
int n, prime[N + 1], dnum[N + 1];
void init (int n) {
	dnum[1] = 1;
	for (int i = 2; i <= n; i ++) {
		if (!prime[i]) {
			prime[++ prime[0]] = i;
			dnum[i] = 2;
		}
		for (int j = 1; j <= prime[0]; j ++) {
			if (i * prime[j] > N)
				break;
			prime[i * prime[j]] = 1;
			if (i % prime[j] == 0) {
				int cnt = 0, temp = i;
				while (temp % prime[j] == 0) {
					temp /= prime[j];
					cnt ++;
				}
				dnum[i * prime[j]] = dnum[i] / (cnt + 1) * (cnt + 2);
				break;
			}else
				dnum[i * prime[j]] = dnum[i] * dnum[prime[j]];
		}
	}
}
int main () {
	init(10000000);
	while (~scanf("%d", &n))
        printf("%d\n", dnum[n]);
	return 0;
}

线性筛约数和

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 10000000;
int n, prime[N + 1], dnum[N + 1];
void init (int n) {
	dnum[1] = 1;
	for (int i = 2; i <= n; i ++) {
		if (!prime[i]) {
			prime[++ prime[0]] = i;
			dnum[i] = i + 1;
		}
		for (int j = 1; j <= prime[0]; j ++) {
			if (i * prime[j] > N)
				break;
			prime[i * prime[j]] = 1;
			if (i % prime[j] == 0) {
				int cnt = 0, temp = i;
				while (temp % prime[j] == 0) {
					temp /= prime[j];
					cnt ++;
				}
				dnum[i * prime[j]] = dnum[temp] * ((pow(prime[j], cnt + 2) - 1) / (prime[j] - 1));
				break;
			}else
				dnum[i * prime[j]] = dnum[i] * dnum[prime[j]];
		}
	}
}
int main () {
	init(10000000);
	while (~scanf("%d", &n))
        printf("%d\n", dnum[n]);
	return 0;
}

线性筛质数

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 100000010;
int n, q, pri[N], cnt;
bool vis[N];
void prime () {
	for (int i = 2; i <= n; i ++) {
		if (!vis[i])
			pri[++ cnt] = i;
		for (int j = 1; j <= cnt && pri[j] <= n / i; j ++) {
			if (i % pri[j]) vis[i * pri[j]] = 1;
			else {
				vis[i * pri[j]] = 1;
				break;
			}
		}
	}
}
int main () {
	scanf("%d%d", &n, &q);
	prime();
	for (int i = 1; i <= q; i ++) {
		int k;
		scanf("%d", &k);
		printf("%d\n", pri[k]);
	}
	return 0;
}

线性筛莫比乌斯函数

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 100000010;
int pri[N], cnt, mu[N];
bool vis[N];
void getmu (int n) {
	mu[1] = 1;
	for (int i = 2; i <= n; i ++) {
		if (!vis[i]) {
			pri[++ cnt] = i;
			mu[i] = -1;
		}
		for (int j = 1; j <= cnt && pri[j] <= n / i; j ++) {
			vis[i * pri[j]] = 1;
			if (!(i % pri[j])) break;
			mu[i * pri[j]] = -mu[i];
		}
	}
}
int main () {
	getmu(10000000);
	return 0;
}

线性筛欧拉函数

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 5000010;
int pri[N], vis[N], cnt, phi[N];
inline void getphi (int n) {
    phi[1] = 1;
    for (int i = 2; i <= n; i ++) {
        if (!vis[i]) {
            pri[++ cnt] = i;
            phi[i] = i - 1;
        }
        for (int j = 1; j <= cnt && i <= n / pri[j]; j ++) {
            vis[i * pri[j]] = 1;
            if (i % pri[j]) phi[i * pri[j]] = phi[i] * phi[pri[j]];
            else {
                phi[i * pri[j]] = phi[i] * pri[j];
                break;
            }
        }
    }
}
int main () {
    getphi(1000000);
    return 0;
}
posted @   duoluoluo  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示