线性筛约数个数
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】