1. 程式人生 > >線性篩——尤拉篩 C++程式實現 洛谷 模板題 P3383

線性篩——尤拉篩 C++程式實現 洛谷 模板題 P3383

洛谷  模板題 P3383

題目描述

如題,給定一個範圍N,你需要處理M個某數字是否為質數的詢問(每個數字均在範圍1-N內)

輸入輸出格式

輸入格式:

第一行包含兩個正整數N、M,分別表示查詢的範圍和查詢的個數。

接下來M行每行包含一個不小於1且不大於N的整數,即詢問該數是否為質數。

輸出格式:

輸出包含M行,每行為Yes或No,即依次為每一個詢問的結果。

輸入輸出樣例

輸入樣例#1: 
100 5
2
3
4
91
97
輸出樣例#1: 
Yes
Yes
No
No
Yes

#include<iostream>

using namespace std;

int tot=0;//素數的個數

int p[10000001];//對不是素數的數進行標記

int c[10000001];//c[i]表示第i個素數

int n,m;

int sushu(int x)//在1-x中 把合數 標記
{
    for(int i=2;i<=x;i++)//從2開始  
    {
        if(p[i]!=1)c[tot++]=i;//如果迴圈到i的時候 i沒被標記 那麼i就是 一個素數
        for(int j=0;j<tot;j++)
        {

            if(i*c[j]>x)break;  //不用對超出範圍的數進行判斷

   p[i*c[j]]=1;//讓i與之前查詢到的素數相乘得到的數一定是合數


            if(i%c[j]==0)break;//如果i是 之前查詢到的素數的倍數 就可以跳出來換下一個i

        }
    }
}
int main()
{
    cin>>n>>m;//1-n的範圍 m次詢問
    sushu(n);
    for(int i=1;i<=m;i++)
    {
        cin>>n;
        if(n==1)//1既不是素數 也不是合數
        {
            cout<<"No"<<endl;
            continue;
        }
        if(p[n])
        {
            cout<<"No"<<endl;
        }
        else cout<<"Yes"<<endl;
    }
}