博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
筛选区间内素数的个数
阅读量:3952 次
发布时间:2019-05-24

本文共 1258 字,大约阅读时间需要 4 分钟。

问题描述

  给定区间[L, R] , 请计算区间中素数的个数。

输入格式

  两个数L和R。

输出格式

  一行,区间中素数的个数。

样例输入

2 11

样例输出

5

数据规模和约定

  2 <= L <= R <= 2147483647 R-L <= 1000000

 

核心代码:for(ll j = max(2LL, (a+i-1)/i) *i; j <=b; j += i)

(这里主要考虑a和i的关系,b仅仅是一个界限)
假如i=2,a=2,
那么第一个离a最近(必须大于等于a)的非素数为4;(注意这个比较特别)
假如i=2,a=3,
那么第一个离a最近(必须大于等于a)的非素数为4;
假如i=2,a=4,
那么第一个离a最近(必须大于等于a)的非素数为4;
假如i=2,a=5,
那么第一个离a最近(必须大于等于a)的非素数为6;
假如i=2,a=6,
那么第一个离a最近(必须大于等于a)的非素数为6;
假如i=2,a=7,
那么第一个离a最近(必须大于等于a)的非素数为8;
假如i=2,a=8,
那么第一个离a最近(必须大于等于a)的非素数为8;
如果a
可见,对于a<2i时,数据没有按照规律发展,独立列举,当a>2i时,才有规律,第一个离a近距离的数为(a+i-1)/i) 倍的i(找规律即可)。
转自某dalao。。

#include 
using namespace std;typedef long long ll;const int MAXN=9999999;int sum=0;bool is_prime[MAXN], vis[MAXN];void getprime(ll a, ll b){ memset(vis, true, sizeof(vis)); for(int i = 0; i < b - a+1; i++) is_prime[i] = true; for(int i = 2; (ll)i * i <=b; i++) { if(vis[i]) { for(int j = 2*i; (ll)j*j <=b; j += i) vis[j] = false; for(ll j=max(2LL,(a+i-1)/i) *i; j <=b; j += i) { is_prime[j-a]=false; } } }}int main(){ ll a, b; ios::sync_with_stdio(false); cin>>a>>b; getprime(a,b); for(ll i = a; i <= b; i++) { if(is_prime[i-a]) sum++; } cout<
<

 

转载地址:http://ixyzi.baihongyu.com/

你可能感兴趣的文章
Knapsack problem FZU - 2214 ( 01背包 )
查看>>
瞌睡 (网易笔试题)
查看>>
1009 说反话 (20 分)
查看>>
1010 一元多项式求导 (25 分)
查看>>
1011 A+B 和 C (15 分)
查看>>
1012 数字分类 (20 分)
查看>>
1013 数素数 (20 分)
查看>>
1014 福尔摩斯的约会 (20 分)
查看>>
1015 德才论 (25 分)
查看>>
1016 部分A+B (15 分)
查看>>
1017 A除以B (20 分)
查看>>
1019 数字黑洞 (20 分)
查看>>
1032 挖掘机技术哪家强 (20 分)
查看>>
Dividing HDU - 1059 ( 多重背包 - 二进制简化 )
查看>>
Robberies HDU - 2955 ( 0-1背包 )
查看>>
FATE HDU - 2459 ( 二维完全背包 )
查看>>
B. Working out CodeForces - 429B (动态规划)
查看>>
10635 - Prince and Princess UVA-10635 (最长公共子序列的O(nlogn)的解法:LCS转换为LIS)
查看>>
Sizeof和Strlen
查看>>
lower_bound和upper_bound
查看>>