bzoj 3798 特殊的質數(分塊打表)

2021-08-05 19:04:42 字數 793 閱讀 1742

time limit: 50 sec  

memory limit: 128 mb

submit: 239  

solved: 119 [

submit][

status][

discuss]

求[a,b]之間的質數個數,並且滿足x=q^2+p^2,p,q是正整數。

第一行輸入a,b

輸出有多少組p,q滿足條件

6 667

預處理所有sum[r]表示區間[1, r]中有多少個滿足條件的質數,

之後每次詢問o(1)查詢

但是n有3*10^8那麼大,開不了那麼大的陣列

考慮分塊打表

開個3000大小的陣列用來存前100000*i個數中有多少個質數

例如c[1]表示前100000個數中有多少個滿足條件的質數,c[15]表示前1500000個數

中有多少個滿足條件的質數

之後每次查詢找到對應的塊,剩下的暴力就好了

加下每次check,複雜度o(100000^1.5)

#includeint sq[18005];

int c[3005] = ;

int find(int x)

j = 18000;

for(i=1;sq[i]x)

j--;

if(sq[i]+sq[j]==x)

return 1;

} return 0;

}int jud(int x)

int main(void)

bzoj3798 特殊的質數

容易發現判斷乙個數是否合法是o n 的,而且每個數都可以單獨做,因此可以分塊打表。每n 個數求一下答案,詢問直接o n 做即可。適當調整打表的間隔能讓計算的次數減少。分塊打表 include include include define block 150000 define maxn 300000...

BZOJ3798 特殊的質數 分塊打表

求 a,b 之間的質數個數,並且滿足x q 2 p 2,p,q是正整數。第一行輸入a,b 輸出有多少組p,q滿足條件 6 66 71 a b 3 10 8 題解 還有什麼比表打錯了更讓人欲哭無淚的 注意一下幾點 1.分塊不能太小,10 5很穩,再小有可能裝不下了 2.2 1 1 1 1,也算 3.不...

DFS 特殊的質數肋骨

時間限制 1000ms 記憶體限制 256000kb 題目描述 農民約翰母牛總是產生最好的肋骨。你能通過農民約翰和美國農業部標記在每根肋骨上的數字認出它們。農民約翰確定他賣給買方的是真正的質數肋骨,是因為從右邊開始切下肋骨,每次還剩下的肋骨上的數字都組成乙個質數,舉例來說 7 3 3 1 全部肋骨上...