区间内素数的个数

2016.1.26


试题描述

给定两个正整数 a 和 b,请你统计区间 [a,b) 内有多少个素数。


输入

共一行包含两个正整数 a 和 b,用一个空格分隔开。

输出

一个数,表示所给区间内的素数的个数。

输入示例

22 37

输出示例


其他说明

数据范围:1≤ a < b ≤ 10^12 , b-a ≤ 10^7 。
样例说明:有23、 29 和 31 共 3 个素数。

区间筛嘛~随便筛~就是当年写的代码比较难看?_?

#include<iostream>
#include<cmath>
using namespace std;
long long a,b;
int mark[1000005],prime[1000005],e,bl[10000005];
int main()
{
    scanf("%lld%lld",&a,&b);
    for(int i=2;i<=1000000;i++)
    {
        if(!mark[i])
        {
            prime[++e]=i;
            for(long long j=(long long)i*i;j<=1000000;j+=i)
            {
                mark[j]=1;
            }
        }
    }
    long long xxx,c;
    for(int i=1;i<=e;i++)
    {
        xxx=(long long)ceil(1.0*a/prime[i]);
        if(xxx==1) xxx++;
        for(long long j=xxx;(c=j*prime[i])<b;j++)
        {
            bl[c-a]=1;
        }
    }
    int ans=0;
    c=b-a;
    for(int i=0;i<c;i++)
    {
        if(!bl[i]) ans++;//cout<<i+a<<" ";
    }
    if(a==1) ans--;
    printf("%d",ans);

}

时间: 2024-10-06 01:11:16

区间内素数的个数的相关文章

《挑战程序设计竞赛》 大区间内素数的个数

题意: 给一个区间边界值很大的区间,但是区间大小较小,求出该区间内所有质数个数. 知识补充: 因数枚举:分解一个数n,至于要从1 枚举到 n??√ 即可,然后把i和 n / i 当做因数加入vector 整数分解(把一个整数枚举出其质数基连乘的形式):从2开始枚举质数基,然后每次把该整数尽可能的被当前质数除去最大次数,这样该整数就会变小,极大减少枚举量.注意和map搭配使用,记录每一个质数的个数. 埃式素数筛法的复杂度是:Ologlogn看做线性也无妨. 求区间[a,b)内素数的个数,由于b的最

区间内素数的个数(也要用到埃氏算法)

题目大意:给定正整数a和b,请问区间[a,b)内有多少个素数 限制条件:a<b<=10^12    b-a<=10^6 样例: 22 37 3 22801763489 22801787297 1000 思路:由于b以内的合数的最小质因数一定不超过根号b,所以如果有根号b以内的素数表的话,就可以用埃氏算法运用在[a,b)上了.  也就是说,先分别做好[2,根号b)的表和[a,b)的表, 然后从[2,根号b)的表中筛得素数的同时,也将其倍数从[a,b)的表中划去,最后剩下的就是[a,b)以内

吉比特_笔试_区间内素数个数

import java.util.Scanner; /** 输入M.N,1 < M < N < 1000000,求区间[M,N]内的所有素数的个数.素数定义:除了1以外,只能被1和自己整除的自然数称为素数 输入描述: 两个整数M,N 输出描述: 区间内素数的个数 示例1 输入 2 10 输出 4 * @author zhaoz * */ public class getMtoNPrime { public static void getPrimeCount(int m, int n) {

统计区间内素数求和

#include<stdio.h> int main() { int m,n; int count=0; int sum=0; scanf("%d%d",&m,&n); if(m==1)//1不是素数 { m=2; } for(int i=m;i<=n;i++) { //判断素数 int isprime=1; for(int k=2;k<i-1;k++) { if(i%k==0) { isprime=0; break; } } if(isprim

用算法求N(N&gt;=3)之内素数的个数

首先,我们谈一下素数的定义,什么是素数?除了1和它本身外,不能被其他自然数整除(除0以外)的数 称之为素数(质数):否则称为合数. 根据素数的定义,在解决这个问题上,一开始我想到的方法是从3到N之间每个奇数进行遍历,然后再按照素数的定义去逐个除以3到 根号N之间的奇数,就可以计算素数的个数了. 于是便编写了下面的代码: (代码是用C++编写的) #include<iostream> #include <time.h> using namespace std; #define N 1

23:区间内的真素数

23:区间内的真素数总时间限制: 1000ms 内存限制: 65536kB描述找出正整数 M 和 N 之间(N 不小于 M)的所有真素数. 真素数的定义:如果一个正整数 P 为素数,且其反序也为素数,那么 P 就为真素数.例如,11,13 均为真素数,因为11的反序还是为11,13 的反序为 31 也为素数. 输入输入两个数 M 和 N,空格间隔,1 <= M <= N <= 100000.输出按从小到大输出 M 和 N 之间(包括 M 和 N )的真素数,逗号间隔.如果之间没有真素数,

HDU 4135 Co-prime 区间内与n互质的个数 容斥(入门

题目链接:点击打开链接 题意:给定区间[l, r] 询问区间内有多少个数和n互质 思路: solve(x) 表示[1,x]区间内与n互质的个数,则ans = solve(r)-solve(l-1); 与n互质的个数=所有数-与n不互质的数=所有数-(与n有一个因子-与n有2个因子的+与n有3个因子的) 状压n的因子个数,然后根据上面的公式容斥得到. #include <stdio.h> #include <iostream> #include <algorithm> #

给出一个区间[a, b],计算区间内“神奇数”的个数。 神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。 比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数。同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数。

给出一个区间[a, b],计算区间内"神奇数"的个数.神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数.比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数.同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数. 输入描述: 输入为两个整数a和b,代表[a, b]区间 (1 ≤ a ≤ b ≤ 10000). 输出描述: 输出为一个整数,表示区间内满足条件的整数个数 输入例子: 11 20 输出例子: 6 1 #in

BZOJ 2818: Gcd区间内最大公约数 为素数的对数(欧拉函数的应用)

传送门 2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3649 Solved: 1605 [Submit][Status][Discuss] Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sample Output 4 HINT hint 对于样例(2,2),(2,4),(3,3),(4,