GOJ 1452(數論 字首和查詢)

2021-08-13 10:21:42 字數 1114 閱讀 3415

思路:

做法1:

離線暴力打表存起來,然後再詢問。

做法2:

找到5e5之內的素數,兩兩相乘,再結合素數的立方,排個序,再詢問。

乙個有四個因子的整數要麼是乙個素數的立方,要麼是兩個不同素數的乘積。

做法3:

列舉每個數,對它的倍數進行計數。那麼最後要求計數器為4的數字。

開始用第一種方法發做,一直tle,感覺應該是最後判斷因子數是4的時候超時了,後來看了下題解,選擇第二種方法做。

證明:第一種情況很明顯,就i是1和本身再加上兩個質因子(任何乙個合數都能表示成幾個質因子的乘積)。第二種情況,即三個素數的乘積。因為相同的兩個素數乘出來的數一定是只有三個因數的。(乙個素因子加1和本身),也就是說它不能分解成除1和本身外的另外兩個因數相乘,即可以看作乘出來的數是不可分的。則a可拆成(p*p) p a 1四個因子。

所以只要把範圍內的所有素數兩兩相乘和素數的立方存起來,查詢一遍就可以。

(這裡有個一直模糊不清的概念,就是1000ms約等於10^8,開始以為是1e9,一直沒找到tle的地方)

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=5e5;

int n,a,b,prime[maxn],primesize,cnt,cnt2,num[maxn];

bool isprime[maxn];

vectorv;

mapm;

void getlist(int listsize)

}}void init()

}for(int i=1;imaxn)

break;

m[ans]=1;

}for(int i=1;i<=maxn;i++)

}int main(){

//freopen("out.txt", "w", stdout);

getlist(maxn);

init();

while(scanf("%d",&n)!=eof){

while(n--){

cnt2=0;

scanf("%d%d",&a,&b);

//cout<

Math Problem(數論 二分 字首和)

已知整數 a,a 3 除 192 的餘數是 1 求區間 l,r 之間滿足條件的 a 的累加和是多少?第一行是乙個整數 t 1 t 10000 表示樣例的個數。每個樣例包含兩個整數 l,r,1 l r 10 9。輸出描述 每行輸出乙個樣例的結果。1 1 101本題來自某大學acm訓練的題,由於我太菜只...

XDU 1022 數論篩法 字首和

解法一 數論篩法 字首和 其實題目中f n 的值可理解為存在多少個整數對使a b n include define n 1007 define maxn 1000005 using namespace std intf maxn void procede int n 預處理 此時f n 理解為表示n...

數論 題解 狄利克雷字首和

先撇開這題不談,通過這題我倒是發現了推了十幾道莫反後連狄利克雷字首和都沒學紮實。狄利克雷字首和定義 f 1 g 我們稱 g 是 f 的狄利克雷字首和。給定 f 1,f 2.f n 考慮如何在 o n log log n 內求出 g 函式。沿用高維字首和的思路,我們可以把每乙個質因子看作一維,然後套用...