质数与约数

质数与约数

素数判断及筛法#

试除法#

若有一个正整数 n 为合数,则存在一个能整除 n 的数 d,且 2dn 。因此我们只需要扫描 2 ∼ n 之间的所有整数,依次检查它们能否整除 n,若都不能整除,则 n 为质数,否则 n 为合数。注意,我们还需要特判 0 和 1 这两个整数。

时间复杂度 O(n)

bool is_prime(int n){
	if(n<2)return false;
	for(int i=1,sq=sqrt(n);i<=sq;i++){
		if(n%i==0)return false;
	}
	return true;
}

埃氏筛#

对于每个质数 p 而言,小于 p2p 的倍数在扫描到更小的质数时就已经被标记过了。

于是从 p2 开始扫。

void found_prime() {
	memset(vis, 0, sizeof(vis));
	vis[0] = 1; vis[1] = 1; // 特殊处理 0 和 1
	for(int i=2; i<=n; ++i) {
		if(!vis[i]) { // i 为质数
		for(int j=i*i; j<=n; j+=i)
			vis[j] = 1; // 标记合数
		}
	}
}

线性筛#

#include<bits/stdc++.h>
using namespace std;
const int N=1e8+50;
int prime[N],cnt;
bool vis[N];
int n,q;
void init(){
	for(int i=2;i<=n;i++){
		if(!vis[i])prime[++cnt]=i;
		for(int j=1;j<=cnt&&prime[j]<=n/i;j++){
			vis[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}
int main(){
	scanf("%d%d",&n,&q);
	init();
	while(q--){
		int x;
		scanf("%d",&x);
		printf("%d\n",prime[x]);
	}
}

素性测试#

算数基本定理#

算术基本定理又名唯一分解定理,任何一个大于 1 的正整数都能唯一分解为若干个质数的乘积。

(这东西太简单就不证了吧)

推论1: n 的正约数个数为:

(c1+1)×(c2+1)××(cm+1)=i=1m(ci+1)

推论2: n 的所有正约数的和为:

(1+p1+p12++p1c1)××(1+pm+pm2++pmcm)=i=1m(j=0ci(pi)j)

posted @   流泪的小酒窝  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu