码迷,mamicode.com
首页 > 其他好文 > 详细

[模板]线性筛素数(欧拉筛法)

时间:2018-11-28 22:05:22      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:algo   while   个数   因子   printf   欧拉   模板   string   for   

用途

$O(n)$处理出n以内所有素数

原理

使用 合数=最大因数(除1和本身外)*最小质因数 的原理来筛,每个数只会被筛一次

对于每个数i,令它是某数的最大因数,然后从小到大地找<=i的素数j,则i*j是合数

直到找到某个j使得$i\%j==0$,因为再往后的话,j‘> i的某个因子,我们能交换j‘和i的这个因子,所以i不是i*j‘的最大因数(或者说i*j‘的最小质因数是刚才的那个j),再往后做没有意义

例题

luogu3383

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 const int maxn=10000010;
 7 
 8 int rd(){
 9     int x=0;char c=getchar();int neg=1;
10     while(c<0||c>9){
11         if(c==-) neg=-1;c=getchar();
12     }
13     while(c>=0&&c<=9) x=x*10+c-0,c=getchar();
14     return x*neg;
15 }
16 
17 int N,M;
18 int pri[maxn],cnt;
19 bool isp[maxn];
20 
21 int main(){
22     int i,j,k;
23     N=rd();M=rd();
24     memset(isp,1,sizeof(isp));isp[0]=isp[1]=0;
25     for(i=2;i<=N;i++){
26         if(isp[i]) pri[++cnt]=i;
27         for(j=1;j<=cnt&&i*pri[j]<=N;j++){
28             isp[i*pri[j]]=0;
29             if(i%pri[j]==0) break;
30         }
31     }
32     
33     for(i=1;i<=M;i++){
34         if(isp[rd()]) printf("Yes\n");
35         else printf("No\n");
36     }
37 }

 

[模板]线性筛素数(欧拉筛法)

标签:algo   while   个数   因子   printf   欧拉   模板   string   for   

原文地址:https://www.cnblogs.com/Ressed/p/10034540.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!