題目描述
在小x的認知裡,質數是除了本身和1以外,沒有其他因數的數。
但由於小x對質數的熱愛超乎尋常,所以小x同樣喜歡那些雖然不是質數, 但卻是由兩個質數相乘得來的數。
於是,我們定義乙個數小x喜歡的數,當且僅其是乙個質數或是兩個質數的乘積。
輸入
第一行輸入個正整數q,表示詢問的組數。
接下來q行,包含兩個正整數l和r,保證l≤r(1<=l<=r<=10000000)。
輸出
輸出q行 ,每乙個整數,表示該區間範圍內小x喜歡的數的個數。
樣例輸入
11 6
樣例輸出
5解題思路
:這道題目的資料非常的大,到了1千萬!所以,用普通的篩表法+後來要查詢時用到的q*二個二分查詢肯定是超時的。所以我們要用厲害一點的篩——線性篩。
線性篩其實是個模板。i從2迴圈到1千萬,如果當前的在陣列f中i這個位置標記為0的話,則i為素數,將陣列f中i這個位置賦為i,並將i放入陣列p中。判斷如果當前f[i]==i||f[i/f[i]]==i/f[i],則用字首和sum[i]=sum[i-1]+1,否則sum[i]=sum[i-1]。再來一重迴圈j,從1到j<=p陣列中數的個數&&p[j]<=f[i],當i*p[j]在1千萬以內時,則f[i*p[j]]=p[j]。
用線性篩,篩的時候用o(n),而到查詢時則用q*o(1),所以總時間複雜度為o(n+q),這樣就不用怕超時了。
**:(請不要直接拷貝哦)
#include #define maxn 10000005
int f[maxn],p[4000000],sum[maxn],t;
using namespace std;
int main()
if ((f[i]==i)||(f[i/f[i]]==i/f[i])) sum[i]=1;
sum[i]+=sum[i-1];
for (int j=1;j<=t&&p[j]<=f[i];j++)
}for (int i=1;i<=q;i++)
}
小X的質數 NOIP模擬賽 魔改線性篩素數
題意 求 l r 範圍內是質數或兩個質數乘積的數的個數 魔改線性篩素數即可,預處理1 nmax的所有符合要求的數的數量,對於每組詢問 o 1 回答。對於每個素數,肯定是要計算的。在後面排除合數的時候,判斷當前數是不是素數,若是,也算入其中。用字首和優化,對於一組詢問 l,r 回答 cnt r cnt...
第n小的質數
這是我第一次發題解,有點小激動。首先題目 總時間限制 1000ms 記憶體限制 65536kb 描述 輸入乙個正整數n,求第n小的質數。輸入 乙個不超過10000的正整數n。輸出 第n小的質數。樣例輸入 10 樣例輸出 29 第一次編寫的 1 include2 using namespace std...
小X的矩陣
題目描述 小x最近迷上了矩陣,他定義了乙個對於一種特殊矩陣的特徵函式g。對於n n的矩陣a,a的所有元素均為0或1,則g a 等於所有a i j a j i 的和對2取餘之後的結果。舉乙個例子 對於上圖這個3 3矩陣a,g a 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 0 ...