找素數 素數篩 離散化)

2021-10-23 03:55:45 字數 838 閱讀 1145

問題描述

給定區間[l, r] , 請計算區間中素數的個數。

輸入格式

兩個數l和r。

輸出格式

一行,區間中素數的個數。

樣例輸入

2 11

樣例輸出

5題目異常簡單,可是不是很好做,l和r的範圍太大了,直接暴力一定會超時,可以借鑑素數篩的思路,用素數把合數篩去,區間內的最大數是r,所以可以做因子的素數一定不大於sqrt®,所以只用把小於sqrt®的所有素數全部篩出來,再用他們去篩區間內的數,有乙個問題素數篩的時候要用到乙個標記陣列,可是r太大了,陣列開不了那麼大,但是有乙個條件r-l<=1e6,所以可以把整個區間離散化到區間[0,r-l]就可以了。

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int inf=

2147483647

,n=1000010

;int l,r;

int prim[n]

,cnt;

bool st[n]

;void

init()

//預處理出來所有的素數,線性篩模板}}

intmain()

int ans=0;

for(

int i=

0;i<=r-l;i++

) ans+

=!st[i]

; cout

}

再來一道類似的題:

尤拉篩找素數

任何合數都可以表示為多個素數的乘積,合數肯定有乙個最小的質因子,通過這個最小質因子篩掉合數,保留素數。aizu0009 求小於或等於n的素數個數 n 1,999999 include include include include using namespace std const int maxa...

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

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

素數判定,素數篩

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