数论基础1009 LightOJ 1197
来源:互联网 发布:xmind8 mac破解序列号 编辑:程序博客网 时间:2024/06/16 19:04
题意:
求a~b有多少个素数
思路:
用类似筛法的方法来判断0~b-a之间来得到答案
先找到每个素数在a~b里的第一个是该素数的>=2倍的位置,然后筛
最后剩下的一定是素数,时间O(b-a)
素数区间是[0,2^16)
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>#include<queue>#include<stack>#include<string>#include<vector>#include<map>#include<set>using namespace std;#define lowbit(x) (x&(-x))typedef long long LL;const int maxn = 100005;const int inf=(1<<28)-1;#define maxp 500005bool notprime[maxp];int primes[maxp];void get_prime(){ notprime[1]=true; for(int i=2;i<maxp;++i) if(!notprime[i]) { primes[++primes[0]]=i; for(LL j=(LL)i*i;j<maxp;j+=i) notprime[j]=true; }}int Num[maxn];int main(){ get_prime(); int T,Case=0; scanf("%d",&T); while(T--) { int a,b; scanf("%d%d",&a,&b); memset(Num,0,sizeof(Num)); int Ans=0; for(int i=1;primes[i]*primes[i]<=b&&i<=primes[0];++i) { int pos=0; if(a%primes[i]) pos+=primes[i]-a%primes[i]; if(a<=primes[i]) pos+=primes[i]; for(int j=pos;j<=b-a;j+=primes[i]) Num[j]=1; } for(int i=0;i<=b-a;++i) Ans+=!Num[i]; if(a==1) Ans--; printf("Case %d: %d\n",++Case,Ans); } return 0;}
0 0
- 数论基础1009 LightOJ 1197
- 基础数论 1001 LightOJ 1370
- 数论基础 1008 LightOJ 1213
- LightOJ 1245 - Harmonic Number (II)(基础数论)
- lightoj 1014 数论
- LightOJ -kuangbin 数论
- lightoj 1045(数论)
- LightOJ-1045-数论
- LightOJ-1090-数论
- 【数论 && 公式推导】LightOJ
- 【数论 && 找规律】LightOJ
- LightOJ 1215 Finding LCM(数论)
- 数论基础
- 数论基础
- 数论 基础
- 数论基础
- 数论基础
- 数论基础
- 44.Your database is functional with a peak load for the last one hour. You want to preserve the perf
- 数论基础 1008 LightOJ 1213
- BeanUtil工具类
- C++语言基础
- python csdn增加访问量
- 数论基础1009 LightOJ 1197
- hdu 5742 (2016 Multi-University Training Contest 2)
- android解析xml-用sax解析
- 设计模式学习笔记(五):工厂方法模式
- ArcGIS Desktop 10.3 破解安装简明教程(支持32/64位+下载地址+亲测可用)
- 根号2的小数点后100位
- 数论基础1010 UVA 11426
- 如何为ORACLE表空间创建大容量数据文件
- tomcat不支持中文路径(链接)的解决办法