埃氏筛法,区间筛法,hdu 2136
2015-07-29 16:35
399 查看
埃氏筛法:
目的:找出0~n这个区间内有几个质数,哪些是质数
做法:遍历2~n这个区间
如果是素数在用一个循环将表中所有该素数的倍数都划掉,最后留下来的就都是素数。
区间筛法:
目的:找出a~b这个区间有几个质数,哪些是质数
做法:
在筛出[0,[0,sqrt(b)))之间的素数的同时,将在[a,b)[a,b)这个区间的之中的该素数的倍数都划掉。
常用与a,b都很大,但是b-a较小时。可参考挑战p120
区间筛法代码:
hdu 2136:
http://acm.hdu.edu.cn/showproblem.php?pid=2136
刚好练一下筛法。
做法:使用一个答案数组和序号数组。找到素数时,用一个数组记录下自己的序号,筛素数的倍数时将记为所使用的这个素数的序号也记到答案数组中。素数自身的答案就是自己的序号。
目的:找出0~n这个区间内有几个质数,哪些是质数
做法:遍历2~n这个区间
如果是素数在用一个循环将表中所有该素数的倍数都划掉,最后留下来的就都是素数。
区间筛法:
目的:找出a~b这个区间有几个质数,哪些是质数
做法:
在筛出[0,[0,sqrt(b)))之间的素数的同时,将在[a,b)[a,b)这个区间的之中的该素数的倍数都划掉。
常用与a,b都很大,但是b-a较小时。可参考挑战p120
区间筛法代码:
[code]#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define M 100000000 typedef long long ll; bool is_prime_small[M]; bool is_prime[M]; ll ans = 0; void prime(ll a,ll b) { for(ll i = 2;i*i < b;i++) is_prime_small[i] = true; //初始化2~b^(1/2) for(ll i = 0;i < b-a;i++) is_prime[i] = true; //因为a,b很大,所以用0~b-a 代表a~b for(ll i = 2;i*i < b;i++) { if(is_prime_small[i]) { for(ll j = 2*i;j*j < b;j += i) is_prime_small[j] = false; for(ll j = max(2LL,(a+i-1)/i)*i;j < b;j += i) //找到从a开始的第一个合数 { if(is_prime[j-a]) { ans++; //求出几个合数。 //或者也可以最后遍历b-a这区间,求出质数的个数。 is_prime[j-a] = false; } } } } return; } int main() { ll a,b; ans = 0; cin >> a >> b; prime(a,b); // for(ll i = 0;i < b-a;i++) // if(is_prime[i]) ans++; cout << "ans = " << b-a-ans << endl; return 0; }
hdu 2136:
http://acm.hdu.edu.cn/showproblem.php?pid=2136
刚好练一下筛法。
做法:使用一个答案数组和序号数组。找到素数时,用一个数组记录下自己的序号,筛素数的倍数时将记为所使用的这个素数的序号也记到答案数组中。素数自身的答案就是自己的序号。
[code]#include <iostream> #include <cstdio> #include <algorithm> using namespace std; #define M 1000001 int num[M]; int is_prime[M]; int ans[M]; void slove() { for(int i = 0;i < M;i++) is_prime[i] = true; int k = 1; num[1] = 0; is_prime[1] = true; for(int i = 2;i < M;i++) { if(is_prime[i]) { num[i] = k++; ans[i] = num[i]; for(int j = 2*i;j < M;j += i) { is_prime[j] = false; ans[j] = num[i]; } } } } int main() { slove(); int a; while(scanf("%d",&a)==1) { printf("%d\n",ans[a]); } return 0; }
相关文章推荐
- Ubuntu 彻底删除 Mysql 然后重装 Mysql
- eclipse点击后出现exit code=13
- 【扫盲贴】浅谈38K红外发射接受编码(非常好)
- Access增删改查 (持续更新中)
- 自定义对象
- PHP---验证码
- uvalive 2218
- bzoj1923: [Sdoi2010]外星千足虫
- LeetCode(120) Triangle
- autoit小贴士
- 判断实体的类型 相关操作
- Buffer中的flip()
- Delete Node in a Linked List
- javascript 继承
- Animator 动画器——参数解释
- c源文件宏展开
- 使用移位操作符实现无符号整数位反转
- ORACLE 毫秒变换为日期 日期转换毫秒
- 关键词抽取简介
- LeetCode_230 Kth Smallest Element in a BST