素數線性篩模板與證明
#include<stdio.h>
const int TOP=1e7+10000;//+10000是為了多篩一個素數
bool e[TOP];
int p[TOP/5];
int pnum;
void prime()//O(n)篩素數,e[x]==0表示x為素數
{
e[0]=e[1]=1;pnum=0;
for(int i=2;i<TOP;i++)
{
if(e[i]==0)p[++pnum]=i;
for(int j=1;j<=pnum&&p[j]*i<TOP;j++)
{
e[p[j]*i]=1 ;
if(i%p[j]==0)break;
}
}
}
int main()
{
prime();
return 0;
}
/*
for(int i=2;i<TOP;i++)
{
if(e[i]==0)p[++pnum]=i;//如果這個數是素數,記錄儲存在p中
不管這個數是不是素數,使用這個數和前面的素數篩選
每個數都可以表示成p1^a1*p2^a2...pn^an(p1<p2<...<pn)的形式
所以其就可以一定可以用p1*(p1^(a1-1)*p2^a2...pn^an)來篩除
我們列舉所有素數,肯定能列舉得到關於i的最小的素因子
for (int j=1;j<=pnum&&p[j]*i<TOP;j++)
{
e[p[j]*i]=1;//p[j]*i一定不是素數,可以被篩掉。
if(i%p[j]==0)break;//對於i,我們只擴充套件——1,i*"i中不包含的素數";2,i*"i所包含的最小素數"
如何保證每個合數都被篩到?
對於i,我們只擴充套件——1,i*"i中不包含的素數";2,i*"i所包含的最小素數"。
比如,p1^a1*p2^a2...pm^am(p1<p2<...<pm)可以篩得的是p1^(a1+1 )*p2^a2...pm^am(p1<p2<...<pm),或者p0^a0*p1^a1*p2^a2...pm^am(p0<p1<p2<...<pm,p0表示比p1小且原來不在x中的素數)
這樣子,每個數是一定能被篩出來的,因為p1^a1*p2^a2...pn^an(p1<p2<...<pn)前面一定有p1^(a1-1)*p2^a2...pn^an(p1<p2<...<pn),而p1^(a1-1)*p2^a2...pn^an(p1<p2<...<pn)是一定可以篩到它的
由於這個關係,顯然也保證了每個數最多隻被篩一次。
}
}
*/
相關推薦
素數線性篩模板與證明
#include<stdio.h> const int TOP=1e7+10000;//+10000是為了多篩一個素數 bool e[TOP]; int p[TOP/5]; int pnum
【 數學基礎】【素數線性篩法--歐拉篩法模板】【普通篩法的優化】
for ++ 自身 素數 spa prime pri 沒有 大於 質數(素數):指大於1的所有自然數中,除了1和自身,不能被其它自然數整除的數 合數:比1大,但不是素數的數稱為合數,合數除了被1和自身整除,還能被其它數整除 質因數(素因數或質因子):能整除給定正整數的質
尤拉函式與線性篩模板
程式碼例項:求單個尤拉函式。分解單個數,可以用迴圈來實現,不必藉助輔助陣列。 //求尤拉函式phi #include<iostream> #include<cstring> using namespace std; int phi(int n){ int ans
素數尤拉線性篩模板
bool isprime[maxm]; int primes[maxn],len; void Get_prime() { len = 0; memset ( isprime , tr
C-素數-線性篩
#include <stdio.h> #include <math.h> int main() { int i, j, k; int a [300]; int p
實現素數線性篩
知識準備 for迴圈 for i in `seq 1 10`; do echo ${i} done #執行結果 --------- 1 2 3 4 5 6 7 8 9 10 -------- for ((i = 0; i < 10; i++)); do
素數表的獲取,素數線性篩法介紹,複雜度超低
//素數線性篩法,複雜度:O(nloglogn) //求100以內素數 #include<iostream> #include<cstring> #include<string> using namespace std; bool vis[101];//
poj 3126 Prime Path【bfs】【素數線性篩】
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28338 Accepted: 15457 Description The ministers
線性篩模板(C++版)
分別是線性篩素數,尤拉函式,莫比烏斯函式,約數個數,約數和,其中有些都是可以一起篩的 這裡給出分別的模板 1. 素數 最基本的,後面基本都要用到素數的篩法 const int N=1e7+50; int
ACM 求素數 線性篩法 o[n]
線性篩法,終於搞明白了,附帶大神的講解,走你 const int N = 5000; int isNotPrime[N]={1,1};//0和1都不是素數,其他的取預設值0代表是素數 int prim
P3383 【模板】線性篩素數
... right else cst pre left 數據 ret col 題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入格式: 第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢
luogu_3383 【模板】線性篩素數
bre rime esp turn bit %d rim style clu 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,cnt,prime[10000010],noprime[1
【luogu 3383】【模板】線性篩素數
100% put pre esp log main col i++ 每一個 題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入格式: 第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。 接
洛谷 P3383 【模板】線性篩素數
toolbar left 整數 show scan fin names 一行 bar P3383 【模板】線性篩素數 題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入
wenbao與篩法素數及判斷模板
phi void flag htm html display euler 發現 經典 1 #define ll long long 2 const int maxn = 1000000; 3 int vis[maxn],prime[maxn]; 4 vo
[模板]線性篩素數(尤拉篩法)
用途 $O(n)$處理出n以內所有素數 原理 使用 合數=最大因數(除1和本身外)*最小質因數 的原理來篩,每個數只會被篩一次 對於每個數i,令它是某數的最大因數,然後從小到大地找<=i的素數j,則i*j是合數 直到找到某個j使得$i\%j==0$,因為再往後的話,j'> i的某個因子,
基礎題 P3383 【模板】線性篩素數 洛谷 簡單
題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入格式: 第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。 接下來M行每行包含一個不小於1且不大於N的整數,即詢問該數是否為質數。 輸出格式: 輸出包含M
[洛谷]P3383 【模板】線性篩素數 (#數學 -1.15)
題目描述 如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內) 輸入輸出格式 輸入格式: 第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。 接下來M行每行包含一個不小於1且不大於N的整數,即詢問該數是否為質數。 輸出格式:
luogu P3383 【模板】線性篩素數
強推洛穀日報 寫的超棒! (洛穀日報裡的文章都超好 (所以我就不說什麼了 質數判定方法 #include<cstdio> #include<cstring> using namespace std; #define maxn 10000010 in
線性篩素數 模板
#include"cstdio" #include"cstring" #include<iostream> using namespace std; #define MAX 10000//求MAX範圍內的素數 long long su[MAX],cnt; bool isprime[MAX