1. 程式人生 > >洛谷 P1865 A % B Problem[篩素數/前綴和思想/區間質數個數]

洛谷 P1865 A % B Problem[篩素數/前綴和思想/區間質數個數]

its 質數 sam span 不用 代碼 class alt 技術

題目描述

區間質數個數

輸入輸出格式

輸入格式:

一行兩個整數 詢問次數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阿QAQ

【代碼】:

技術分享圖片
#include <bits/stdc++.h>

using namespace std;
int const MAX = 505;
int const INF = 0x3fffffff;
int n, m;
int a[1000005];
int isP(int n)
{
    if(n == 1) return 0;
    for(int i=2; i<=sqrt(n); i++){
        if(n % i == 0){
            return 0;
        }
    }
    
return 1; } int main() { cin >> n >> m; a[1] = 0; int l, r, ans = 0; for(int i=2; i<=m; i++){ if( i%2!=0 || i==2){ a[i] = a[i-1] + isP(i); } else{ a[i] = a[i-1]; } } //a[i]=isP(i)+a[i-1]是a[i]=a[i]前所有素數的個數,如果i是素數 a[i]要加一,否則不加(判素數的函數回的是1或0)
while(n--){ ans = 0; cin >> l >> r; if(l<1||r>m){ printf("Crossing the line\n"); } else{ printf("%d\n",a[r] - a[l-1]); } } }
View Code

洛谷 P1865 A % B Problem[篩素數/前綴和思想/區間質數個數]