当前位置:网站首页>【4.1 质数及线性筛】
【4.1 质数及线性筛】
2022-07-26 22:38:00 【浪漫主义狗】
更 好 的 阅 读 体 验 \color{red}{更好的阅读体验} 更好的阅读体验
概念
4.1.1 试除法判定质数
思想
- N < 2 N<2 N<2不是质数
- 从 i = 2 i=2 i=2开始枚举,直到 n \sqrt{n} n,若 i i i能被 N N N整除,说明不是质数
- 反之,则为质数
模板
bool is_prime(int n){
if(n<2) return 0; //若小于2直接返回false
for(int i=2;i<=n/i;i++){
//优化为sqrt(n)
if(n%i==0) return 0;
}
return 1;
}
例题 866. 试除法判定质数
描述
给定 n 个正整数 ai,判定每个数是否是质数。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai。
输出格式
共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No。
数据范围
1≤n≤100,
1≤ai≤2^31−1
输入样例:
2
2
6
输出样例:
Yes
No
代码
#include <bits/stdc++.h>
using namespace std;
bool is_prime(int n){
if(n<2) return 0;
for(int i=2;i<=n/i;i++){
if(n%i==0) return 0;
}
return 1;
}
int main(){
int t;
cin>>t;
while(t--){
int x;
cin>>x;
if(is_prime(x)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
4.1.2 分解质因数
概念
- 每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数
- 把一个合数用质因数乘积的形式表示出来,叫做分解质因数
- 如 30 = 2 × 3 × 5 30=2\times3\times5 30=2×3×5 ,分解质因数只针对合数。
思想
- 算术基本定理:任何一个大于 1 1 1的自然数 N N N,如果 N N N不为质数
- 那么 N N N可以唯一分解成有限个质数的乘积 N = p 1 a 1 × p 2 a 2 ⋯ × p i a k N=p_1^{a_1}\times p_2^{a_2}\dots\times p_i^{a_k} N=p1a1×p2a2⋯×piak,且最多只有一个大于 n \sqrt{n} n的质因子
- 这里 p 1 < p 2 < p 3 … p i p_1<p_2<p_3\dots p_i p1<p2<p3…pi均为质数,其中指数 a k a_k ak是正整数
模板
map<int,int> primes; //存储质因子底数和其指数的映射
void get_div(int n){
primes.clear(); //清空数据
for(int i=2;i<=n/i;i++){
//从2开始枚举质因子
if(n%i==0){
//当其为质因子时
while(n%i==0){
primes[i]++; //指数增加
n/=i;
}
}
}
if(n>1) primes[n]++; //剩余的数大于1则为最后的质因子
}
例题 867. 分解质因数
描述
给定 n 个正整数 ai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai。
输出格式
对于每个正整数 ai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。
每个正整数的质因数全部输出完毕后,输出一个空行。
数据范围
1≤n≤100,
2≤ai≤2×109
输入样例:
2
6
8
输出样例:
2 1
3 1
2 3
代码
#include <bits/stdc++.h>
using namespace std;
map<int,int> primes;
void get_div(int n){
primes.clear();
for(int i=2;i<=n/i;i++){
if(n%i==0){
while(n%i==0){
primes[i]++;
n/=i;
}
}
}
if(n>1) primes[n]++;
}
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
get_div(x);
for(auto &p : primes) cout<<p.first<<" "<<p.second<<endl;
cout<<endl;
}
return 0;
}
4.1.3 线性筛法求质数
思想
- 对于 1 ∼ N 1\sim N 1∼N中的一个合数 n n n
- 从小到大枚举筛选出的质数 p p p,将 1 ∼ N 1\sim N 1∼N范围内质数 p p p的倍数的合数筛掉
- 从而保证了 n n n只会被其最小质因子 p j p_j pj筛掉,且一定会在枚举到 p j × n p j p_j\times\frac{n}{p_j} pj×pjn之前筛掉
模板
int cnt; //记录质数个数
int primes[N]; //存储当前筛选出的质数
bool vis[N]; //标记是否被筛掉
void get_primes(int n){
for(int i=2;i<=n;i++){
//外层从2~n迭代
if(!vis[i]) primes[cnt++]=i; //没有被筛掉说明是质数,记录到primes[N]中
for(int j=0;primes[j]<=n/i;j++){
//将1~n范围内质数primes[j]的i倍的合数筛掉
vis[primes[j]*i]=1; //用最小质因子primes[j]筛掉合数
if(i%primes[j]==0) break;
//i%primes[j]!=0 : 说明primes[j] < i的所有质因子,故primes[j]是primes[j]*i的最小质因子
//i%primes[j]==0 : 说明从小到大枚举到此时的primes[j],一定是i的最小质因子
}
}
}
例题 868. 筛质数
描述
给定一个正整数 n,请你求出 1∼n 中质数的个数。
输入格式
共一行,包含整数 n。
输出格式
共一行,包含一个整数,表示 1∼n 中质数的个数。
数据范围
1≤n≤106
输入样例:
8
输出样例:
4
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+3;
int cnt; //记录质数个数
int primes[N]; //存储当前筛选出的质数
bool vis[N]; //标记是否被筛掉
void get_primes(int n){
for(int i=2;i<=n;i++){
//外层从2~n迭代
if(!vis[i]) primes[cnt++]=i; //没有被筛掉说明是质数,记录到primes[N]中
for(int j=0;primes[j]<=n/i;j++){
//将1~n范围内质数primes[j]的i倍的合数筛掉
vis[primes[j]*i]=1; //用最小质因子primes[j]筛掉合数
if(i%primes[j]==0) break;
//i%primes[j]!=0 : 说明primes[j] < i的所有质因子,故primes[j]是primes[j]*i的最小质因子
//i%primes[j]==0 : 说明从小到大枚举到此时的primes[j],一定是i的最小质因子
}
}
}
int main(){
int n;
cin>>n;
get_primes(n);
cout<<cnt<<endl;
return 0;
}
边栏推荐
- RESNET paper interpretation and code implementation (pytorch)
- Shang school software testing (1) software testing curriculum system, advantages, learning suggestions, understanding software, software testing and defects, software testing process, debugging and te
- 蓝桥杯 1004 [递归]母牛的故事
- 寻找真凶
- 哨兵2号(Sentinel-2)的下载及处理
- 信号与系统学习零输入响应
- Shufflenet series (2): explanation of shufflenet V2 theory
- SSRF (server side request forgery) -- Principle & bypass & Defense
- LeetCode——哈希表篇
- Signal and system learning zero input response
猜你喜欢

信号与系统学习零输入响应

机器人学台大林教授课程笔记

Helicopter control system based on Simulink

Viterbi Viterbi decoding bit error rate simulation, modulation is QPSK, channel is Gaussian white noise

1、 Kubernetes basic concept + environment installation (build cross server public network environment)

7_ Principal component analysis

C语言 求素数、闰年以及最小公倍数最大公约数

10_ Evaluate classification

Signal and system learning zero input response

Deep learning of parameter adjustment skills
随机推荐
Shufflenet series (2): explanation of shufflenet V2 theory
傅里叶分析(基础介绍)
13_ Ensemble learning and random forests
"Could not load host key" error when xshell connects to the server
输入一串字母 将里面的元音输出希望各位大佬能给指导
[LeetCode] 无重复最长字符串
C and pointer Chapter 18 runtime environment 18.1 judgment of runtime environment
Visual studio C cs0006 C failed to find metadata file
When the label begins with "IMS", why does logcat not print the log?
Double. isNaN(double var)
c语言 static运用,灵活改变生命周期,让你写代码如鱼得水
C and pointer Chapter 18 runtime efficiency 18.3 runtime efficiency
Web middleware log analysis script 2.0 (shell script)
机器人学台大林教授课程笔记
deeplabcut使用1
Flink SQL (II) Kafka connector
Find method of web page parsing by crawler
知识蒸馏——pytorch实现
Anaconda = > pycharm=> CUDA=> cudnn=> pytorch environment configuration
[PCB open source sharing] stc32g12k128/stc8h8k64u development board