线性筛求约数个数以及约数和
RT 考试的时候口胡出来的,正确性不会证,不过貌似100000内的数都是对的(现在已经会了,在此鸣谢gyz大佬)
代码:
copy
copy#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e7+10,maxm=3000000;
int a[maxn],prime[maxm],f[maxn];
bool is_not_prime[maxn];
int n,mod,tot;
ll ans;
void Solve(){
scanf("%d%d",&n,&mod);
is_not_prime[0]=is_not_prime[1]=f[1]=1;
for(register int i=2;i<=n;++i){
if(!is_not_prime[i]){
prime[++tot]=i;
f[i]=2;
}
for(register int j=1;j<=tot&&prime[j]*i<=n;++j){
is_not_prime[i*prime[j]]=1;
if(i%prime[j]!=0) f[i*prime[j]]=f[i]*f[prime[j]];
else{
f[i*prime[j]]=f[i]*2-f[i/prime[j]];
break;
}
}
}
}
int main(){
freopen("in","r",stdin);
// freopen("out2","w",stdout);
Solve();
return 0;
}
关于正确性证明(以下证明来自gyz大佬):
首先根据线性筛原理,当 可以整除 时, 为 的最小质因子。
为了方便,用代替。
……
根据唯一分解定理,有……
不妨设……
则有:
所以
和传统写法相比,少开一个数组记录每个数的最小质因子出现的次数。同时也省去一些对这个数组的维护。
oiwiki上的筛法:
copy
copyvoid pre() {
d[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!v[i]) v[i] = 1, p[++tot] = i, d[i] = 2, num[i] = 1;
for (int j = 1; j <= tot && i <= n / p[j]; ++j) {
v[p[j] * i] = 1;
if (i % p[j] == 0) {
num[i * p[j]] = num[i] + 1;
d[i * p[j]] = d[i] / num[i * p[j]] * (num[i * p[j]] + 1);
break;
} else {
num[i * p[j]] = 1;
d[i * p[j]] = d[i] * 2;
}
}
}
}
所以这份代码里面的num数组是可以省去的
线性筛求约数和:
copy
copy#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e7+10,maxm=3000000;
int a[maxn],prime[maxm];
ll num[maxn],f[maxn];
bool is_not_prime[maxn];
int n,mod,tot;
ll ans;
void Solve(){
scanf("%d%d",&n,&mod);
is_not_prime[0]=is_not_prime[1]=f[1]=1;
for(register int i=2;i<=n;++i){
if(!is_not_prime[i]){
prime[++tot]=i;
f[i]=num[i]=i+1;
}
for(register int j=1;j<=tot&&prime[j]*i<=n;++j){
is_not_prime[i*prime[j]]=1;
if(i%prime[j]!=0){
f[i*prime[j]]=f[i]*f[prime[j]];
num[i*prime[j]]=prime[j]+1;
}
else{
f[i*prime[j]]=f[i]/num[i]*(num[i]*prime[j]+1);
num[i*prime[j]]*=prime[j];
num[i*prime[j]]++;
break;
}
}
}
}
int main(){
freopen("in","r",stdin);
// freopen("out2","w",stdout);
Solve();
return 0;
}
(写的貌似没错吧。。。。没调试)
证明见这位神犇的博客
暂时没想出来去掉这份代码里面num数组的方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理