埃氏筛素数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int jdg[10000001],n,m;
int main()
{
    cin>>n>>m;
    jdg[1]=1;
    for(int i=2;i<=n;i++)
        for(int j=i;j<=n/i;j++)
            jdg[i*j]=1;
    for(int i=1;i<=m;i++)
    {
        int a;
        cin>>a;
        if(jdg[a]==0)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/water-radish/p/9280645.html

时间: 2024-10-13 21:17:26

埃氏筛素数的相关文章

素数表的获取(埃氏筛和欧拉筛)

Eratosthenes筛法(埃氏筛) 时间复杂度:O(nlognlogn) 思路 代码 const int maxn=1e6+10; //表长 int prime[maxn],cnt=0; //prime数组存放所以素数,cnt为素数个数 bool st[maxn]; //false为素数 void get_prime(int n){ for(int i=2;i<=n;i++){ if(!st[i]){ prime[cnt++]=i; //把素数i存到prime数组中 for(int j=i+

埃氏筛+线段树——cf731F

从2e5-1依次枚举每个数作为主显卡,然后分段求比它大的数的个数,这里的复杂度是调和级数ln2e5,即埃氏筛的复杂度.. #include<bits/stdc++.h> using namespace std; #define ll long long #define N 200005 int cnt[N],n; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 ll num[N<<2]; void upda

埃氏筛法(素数筛)

埃式筛法:给定一个正整数n(n<=10^6),问n以内有多少个素数? 做法:做法其实很简单,首先将2到n范围内的整数写下来,其中2是最小的素数.将表中所有的2的倍数划去,表中剩下的最小的数字就是3,他不能被更小的数整除,所以3是素数.再将表中所有的3的倍数划去……以此类推,如果表中剩余的最小的数是m,那么m就是素数.然后将表中所有m的倍数划去,像这样反复操作,就能依次枚举n以内的素数,这样的时间复杂度是O(nloglogn). 题解:如果要是按照一个一个判断是否是素数然后把ans+1,时间复杂度

埃氏筛选 - 素数的个数

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; const int maxn = 1000000 + 200; int prime[maxn]; //第i个素数 bool is_prime[maxn + 1]; //is_prime[i]位true, 表示i是素数 void solve(); int sieve

【计蒜客习题】 蒜头君的猜想(埃氏筛)

解题思路: 从1到n将所有数筛一遍,枚举加数,如果这两个加数都是质数,那么方案数加1. AC代码: 1 #include<cstdio> 2 3 using namespace std; 4 5 int n,ans; 6 bool vis[8000001]; 7 8 int main() 9 { 10 scanf("%d",&n); 11 for(int i = 2;i * i <= n; i++) 12 if(!vis[i]) { 13 for(int j

hdu1215七夕节-(埃氏筛+唯一分解定理)

七夕节 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 56666    Accepted Submission(s): 18239 Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"人们纷纷来到告示

【算法杂谈】埃氏素数筛

[今天我们来讲讲筛子] [埃氏筛的基本思想] 简单来说就是把不大于(n为数据范围)以内的素数的倍数全都去掉,那么剩下的就是2~n之间的素数了. [举个例子] 我们假设现在n是25. 第一步:先把2作为筛子,那么所有2的倍数都被筛掉了. 则当前序列为:2 3 5 7 9 11 13 15 17 19 21 23 25 第二步:剩下的序列中第一个素数是3,将序列中3的倍数划掉. 则当前序列为:2 3 5 7 11 13 17 19 23 25 25仍然大于3的平方,所以我们还要继续筛 现在序列中第一

素数的快速筛选(埃氏筛法)

要枚举n以内的素数,可以用埃氏筛法.这是一个与辗转相除法一样古老的算法. 首先,将2到n范围内的所有整数写下来.其中最小的数字2是素数.将表中所有2的倍数都划去.表中剩余的最小数字是3,它不能被更小的数整除,所以是素数.再将表中所有3的倍数全都划去.依次类推,如果表中剩余的最小数字是m时,m就是素数.然后将表中所有m的倍数全部划去.像这样反复操作,就能依次枚举n以内的素数. int prime[maxn];//第i个素数 bool is_prime[maxn];//is_prime[i]为tru

线性筛素数、欧拉函数

判断一个数n是否是素数,众所周知可以用O(sqrt(n))的方法. 但是如果要求很多个数,这个方法就不太好了.(比如所有小于n的数,复杂度就是O(n1.5).) 埃拉托斯特尼筛法,大家都听说过.从2到n,去掉每个数的倍数,剩下来的就是质数. 不过这个方法会重复删除,比如6是2.3的倍数,会被删2次,因子越多,删的次数就越多. 改进之后的线性筛保证每个数只被最小的质因子删,所以是O(n)的. #include<cstdio> #include<cstring> #define MAX