nefu 582 素數判定(素數篩法和基本法雙排)

2021-07-29 22:17:10 字數 1434 閱讀 4423

解題方案:本題範圍為1e5,可以直接用基本法或篩法,這裡用兩者雙排的方法,大概可以解決範圍上界為1e14的素數判定。

定理:如果

n 是乙個合數,則

n必有小於或等於sq

rt(n

) 的素因子。

證明:

n 為乙個合數,首先根據算術基本定理(即正整數的唯一分解定理:每個大於1的自然數均可寫為素數的積),可知

n至少有兩個素因子,假設其素因子都大於n√

,則這些素因子的積肯定會大於

n ,與算術基本定理矛盾,故假設不成立,即

n至少會有乙個小於或等於n√

的素因子,故上述定理成立。

**如下,複雜度近似o(1e7)

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define for(i,k,n) for(int i=k;i#define forr(i,k,n) for(int i=k;i<=n;i++)

#define scan(a) scanf("%d",&a)

#define scann(a,b) scanf("%d%d",&a,&b)

#define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c)

#define mst(a,n) memset(a,n,sizeof(a))

#define ll long long

#define n 1005

#define mod 1000000007

#define inf 0x3f3f3f3f

const

double eps=1e-8;

const

double pi=acos(-1.0);

const

int maxn=1e7;

bool isprime[maxn];//10mb

int prime[maxn];//40mb

int main()

}ll n;

while(cin>>n)

int flag=1;

for(int i=0;prime[i]<=sqrt(n);i++)

}if(flag) cout

<<"yes"

cout

<<"no"

0;}

素數判定,素數篩

這些零碎的知識點每個都學過n次了,但隔一段時間就會忘,記錄下來 素數定義 只能被自身和1整除的大於1的正整數 通過這個定義,我們就可以得出判斷素數的 這裡用到了cmath中的sqrt函式,其原型為double sqrt double 所以在取上界的時候,為了避免double帶來的精度丟失,寧可多列舉...

素數判定(素數篩法)(尤拉)

這裡主要說一下素數篩法,該方法可以快速的選取出1 n數字中的所有素數。時間複雜度遠小於o n sqrt n 方法為 從2開始,往後所有素數的倍數都不是素數。最後剩下的數都是素數。再說說尤拉公式,用來解決所有小於n中的數字有多少個與n互質,用 n 表示。n n 1 1 q1 1 1 q2 1 1 qk...

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...