原題
本來get到了乙個很好的判斷素數的方法
o(玄學常數) (我的luogu部落格 嘻嘻)
#include#include#include
#include
using
namespace
std;
intn,m;
bool su(int
a)
return1;
}int
main()
return0;
}
然而這個方法在一些時候是有弊病的。比如本題區間質數查詢時,有些數需要重複的判斷多次。用這個方法就會t掉部分點。
一位@enderturtle大佬給出了另一種方法。
所以說,對於不同的方法,還要注意看它們的優點,適宜什麼情況啊(嘆氣
#include#include#include
using
namespace
std;
intn,m;
int tot[1000005
];bool book[1000005
];void prime(int
f) }
else tot[i]=tot[i-1
]; }
}int
main()
else
printf(
"%d\n
",tot[r]-tot[l]);}}
return0;
}
所以我們換個角度從判斷素數,變成判斷合數;合數顯然是可以分解質因數的,既然如此,也就說明,質數的倍數(倍數》1)都是合數,所以就有了線性篩(不懂線性篩的同學可以看洛谷[【模板】線性篩素數]( "【模板】線性篩素數"))
區間和可以用字首和處理;
f[r]-f[l],如果l是質數還要加1
luogu P1865 區間質數個數
區間質數個數 一行兩個整數 詢問次數n,範圍m 接下來n行,每行兩個整數 l,r 表示區間 對於每次詢問輸出個數 t,如l或r 1,m 輸出 crossing the line 2 51 3 2 62 crossing the line 資料範圍和約定 對於20 的資料 1 n 10 1 m 10 ...
洛谷 p1865 區間質數個數
方法一 線性篩 字首和 方法二 尤拉篩 線段樹 叫做a b promblem其實是為了吸引我們點進來.區間質數個數輸入格式 一行兩個整數 詢問次數n,範圍m 接下來n行,每行兩個整數 l,r 表示區間 輸出格式 對於每次詢問輸出個數 t,如l或r 1,m 輸出 crossing the line 輸...
Luogu P4514(樹狀陣列區間查詢區間修改)
第一分鐘,x說,要有矩陣,於是便有了乙個裡面寫滿了 00 的 n mn m 矩陣。第二分鐘,l說,要能修改,於是便有了將左上角為 a,b a,b 右下角為 c,d c,d 的乙個矩形區域內的全部數字加上乙個值的操作。第三分鐘,k說,要能查詢,於是便有了求給定矩形區域內的全部數字和的操作。第四分鐘,彩...