洛谷 P1865 A % B Problem(求區間質數個數)
阿新 • • 發佈:2019-02-11
cst 表示 前綴 pac color 合數 ssi adg 接下來
題目背景
題目名稱是吸引你點進來的
實際上該題還是很水的
題目描述
區間質數個數
輸入輸出格式
輸入格式:
一行兩個整數 詢問次數n,範圍m
接下來n行,每行兩個整數 l,r 表示區間
輸出格式:
對於每次詢問輸出個數 t,如l或r?[1,m]輸出 Crossing the line
輸入輸出樣例
輸入樣例#1:2 5
1 3
2 6
輸出樣例#1: 2
Crossing the line
說明
【數據範圍和約定】
對於20%的數據 1<=n<=10 1<=m<=10
對於100%的數據 1<=n<=1000 1<=m<=1000000 -10^9<=l<=r<=10^9 1<=t<=1000000
解題思路:
本題如果直接求區間質數個數,會TLE,所以我們換個角度,將範圍內所有合數標記,剩下的數即為素數,再進行查詢即可.
AC代碼:
1 #include<cstdio> 2 using namespace std; 3 int n,m,f[1000000],l,r; 4 bool vis[1000000]; 5 void shai(int l) {//埃氏篩 6 f[1] = 0; 7 vis[1] = true;//將1標記出來 8 for(int i = 2;i <= l; i++) { 9 if(!vis[i]) {//如果是素數 10f[i] = f[i-1] + 1;//前綴和計算 11 for(int j = i + i;j <= l; j += i) 12 vis[j] = true; 13 } 14 else 15 f[i] = f[i-1]; //前綴和轉移 16 17 } 18 } 19 int main() 20 { 21 scanf("%d%d",&n,&m); 22 shai(m); 23 for(inti = 1;i <= n; i++) { 24 scanf("%d%d",&l,&r); 25 if(l < 1 || r > m) printf("Crossing the line\n"); 26 else 27 printf("%d\n",f[r] - f[l-1]); 28 } 29 return 0; 30 }
洛谷 P1865 A % B Problem(求區間質數個數)