【洛谷 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 }