1. 程式人生 > >洛谷 P1865 A % B Problem(求區間質數個數)

洛谷 P1865 A % B Problem(求區間質數個數)

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]) {//如果是素數 
10
f[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(int
i = 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(求區間質數個數)