【洛谷 p3383】模板-线性筛素数(数论)

题目:给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内)。(N<=10000000,M<=100000)

解法:1.欧拉筛O(n),数组近乎100KB;2.(我这题copy了数据范围肯定是有原因滴......)欧拉函数判断素数O(m log n),m 比 n 小啊,可以分解质因数求欧拉函数。

2种写法我在这篇博文里都有写:【poj 2407】Relatives(数论--欧拉函数 模版题)

下面的代码是第一种方法的,

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 
 7 const int N=10000000;
 8 int pr=0;
 9 int prim[700000],isprime[N+10];
10 
11 void get_prime()
12 {
13     memset(isprime,-1,sizeof(isprime));
14     isprime[1]=0;//
15     for (int i=2;i<=N;i++)
16     {
17       if (isprime[i]==-1) prim[++pr]=i;
18       for (int j=1;j<=pr && prim[j]*i<=N;j++)
19       {
20         isprime[prim[j]*i]=0;
21         if (i%prim[j]==0) break;
22       }
23     }
24 }
25 int main()
26 {
27     get_prime();
28     int n,m,x;
29     scanf("%d%d",&n,&m);
30     while (m--)
31     {
32       scanf("%d",&x);
33       if (isprime[x]==-1) printf("Yes\n");
34       else printf("No\n");
35     }
36     return 0;
37 }

 

posted @ 2016-11-17 17:08  konjac蒟蒻  阅读(227)  评论(0编辑  收藏  举报