素数筛 codevs 1675 大质数 2

1675 大质数 2

时间限制: 1 s

空间限制: 1000 KB

题目等级 : 钻石 Diamond

题解

查看运行结果

题目描述 Description

小明因为没做作业而被数学老师罚站,之后数学老师要他回家把第n个质数找出来。

小明于是交给聪明的你。请你帮忙!【wikioi-1530】

…………………………以上为背景…………………………

老师怀疑小明仅仅是找到第n个质数,于是又叫小明把1到n以内(不包括n)的质数全部找出来。小明又找到了你……

输入描述 Input Description

一个正整数n。

(1<=n<=1000000)

输出描述 Output Description

n以内的质数,每个一行。

样例输入 Sample Input

233

样例输出 Sample Output

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229          //(不含n=233)

Euler筛法(线性筛法):

 1 #include<iostream>
 2 using namespace std;
 3 #include<cstdio>
 4 #define N 1001000
 5 #include<bitset>
 6 bitset<N>check;
 7 int prim[N],tot=0;
 8 int main()
 9 {
10     int n;
11     cin>>n;
12     check.set();
13     for(int i=2;i<n;++i)
14     {
15         if(check[i])
16         {
17             printf("%d\n",i);
18             prim[tot++]=i;
19         }
20         for(int j=0;j<tot;++j)
21         {
22             if(prim[j]*i>=n) break;
23             check[prim[j]*i]=false;
24             if(i%prim[j]==0) break;
25         }
26     }
27
28     return 0;
29 }

埃氏筛法:

 1 /*/*这个程序在i==四万多的时候溢出了,而欧拉筛法因为有“if(i%prim[j]==0) break;
 2 ”,所以一般不会乘法溢出*/*/
 3 #include<iostream>
 4 using namespace std;
 5 #include<cstdio>
 6 #define N 1001000
 7 #include<bitset>
 8 bitset<N>check;
 9 int prim[N],tot=0;
10 int main()
11 {
12     int n;
13     cin>>n;
14     check.set();
15     for(int i=2;i<n;++i)
16     {
17         if(check[i])
18         {
19             printf("%d\n",i);
20             for(int j=i*i;j<n;j+=i)
21               check[j]=false;
22         }
23
24     }
25
26     return 0;
27 }
时间: 2024-10-06 15:45:45

素数筛 codevs 1675 大质数 2的相关文章

codevs——1675 大质数 2

1675 大质数 2 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师要他回家把第n个质数找出来. 小明于是交给聪明的你.请你帮忙![wikioi-1530] …………………………以上为背景………………………… 老师怀疑小明仅仅是找到第n个质数,于是又叫小明把1到n以内(不包括n)的质数全部找出来.小明又找到了你…… 输入描述 Input Description 一个正整数n

1675 大质数 2

1675 大质数 2 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师要他回家把第n个质数找出来. 小明于是交给聪明的你.请你帮忙![wikioi-1530] …………………………以上为背景………………………… 老师怀疑小明仅仅是找到第n个质数,于是又叫小明把1到n以内(不包括n)的质数全部找出来.小明又找到了你…… 输入描述 Input Description 一个正整数n. (

codevs——1530 大质数

1530 大质数 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师要他回家把第n个质数找出来.(1<=n<=100000) 老师随机写了几个数,交给了小明.小明百度找了很久,都没能解决.现在交给聪明的你.请你帮忙! ———————————————————————————————————————————— 简单描述:把第n个质数找出来. 输入描述 Input Description

codevs 2530大质数

链接:http://codevs.cn/problem/1530/ 解题思路: 这个题最关键的剪枝还是 因子小于平方根,但不是像原来那样用. 逆转思维,与其说判断哪些是质数,不如说判断哪些不是质数,更简单,更效率. 所有的合数都有一个共同的特点,就是能被拆成质因子. 那么已经出现的质因子,迟早有一次会成为一个合数的因子. 那么直接拿要判断的数挨个被质数除一遍,就可以直接判断是不是合数了. 写到这,前三个点就过了,至于最后一个100000,就是开头提到的剪枝. 不管怎样,一个合数里面的质因子一定也

SDUT 3305 质数中的质数 (素数筛)

质数中的质数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 如果一个质数,它在质数中的编号也是质数,就称为质数中的质数. 例如3是一个排在第2位质数,所以3是质数中的质数,虽然7是一个质数,但7排在第4位,所以7不是质数中的质数 给你一个数n,求出 >=n 的一个最小的质数中的质数 输入 输入一个数n(0<=n <= 10^6) 输出 输出>=n的最小的质数中的质数 示例输入 2 3 4 示例输出 3 3 5

[luoguP1835] 素数密度_NOI导刊2011提高(04)(素数筛)

传送门 数据辣么大,怎么搞?(L≤R≤2147483647) 注意到R-L≤1000000 所以可以直接筛R-L区间内的数, 但是需要用已知的小的素数筛, R-L区间内的大部分数肯定能用较小的素数筛去,但是还有一些较大的数,可能等于两个大质数的乘积,没法被筛去. 但是又注意到,数据最大才10位,也就是说我们只需要用位数<=5的素数筛就可以了,所以先预处理出来,直接筛就ok了. #include <cstdio> #define N 1000001 #define max(x, y) ((

Light oj 1197 - Help Hanzo (素数筛技巧)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1197 给你a和b求a到b之间的素数个数. 先在小区间素数筛,大区间就用类似素数筛的想法,把a到b之间不是素数的标记出来.因为b-a最多1e5的大小,所以每组数据的时间复杂度最多就o(1e5 log1e5). 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using names

HDU 4497 素数筛,合数分解

题意:给你两个数,G和L ,它们是一组数的GCD(最大公约数)和LCM(最小公倍数),求出满足条件的组合数,每个组合有三个数,排序不同,也算不同组合. L : p1^t1 * p2^t2 ... * pi^ti G: q1^s1 * q2^s2... * qi^si (pi和qii都是素数ii) G(最大公约数)里出现的所有数都要在L(最小公倍数)里出现,或者说L mod G=0,有人要问为什么了?其实仔细想想就清楚了,如果a,b,c的最小公倍数肯定可以被a,b,c任意一个整除,而他们的最大公约

Help Hanzo (素数筛+区间枚举)

Help Hanzo 题意:求a~b间素数个数(1 ≤ a ≤ b < 231, b - a ≤ 100000).     (全题在文末) 题解: a~b枚举必定TLE,普通打表MLE,真是头疼.. b - a ≤ 100000 是关键. 类似素数筛的方法: 1.初始化vis[]=0 ; 2.素数的倍数vis[]=1; 3.  b较小时,素数筛解决   b很大时,素数筛的vis[]会MLE,此时用vis2[i-a]保存vis[i]就不会MLE 了.. #include<iostream>