1. 程式人生 > >素數線性篩模板與證明

素數線性篩模板與證明

#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