素数统计

题目:

【问题描述】

小tan的老师揣谙戈给同学们布置了一道题,要求统计给定区间内素数的个数。“这不是很简单吗?”小tan忍不住说。揣谙戈冷笑一下说:“等你们看到题目就知道了。”便转身离去。

果然,小tan被那极大的区间吓怕了,现在是你拯救她的时候。

【输入】

输入文件名为pcount.in。

输入一行两个正整数a和b,表示给定区间为[a,b]。

【输出】

输出文件名为pcount.out。

输出一个整数,表示区间内素数数量。

【输入输出样例】


pcount.in


pcount.out


1 17


7

【数据范围】

对于30%的数据,有n<m≤1,000;

对于60%的数据,有n<m≤1,000,000;

对于100%的数据,有n<m<2^31,m-n≤1,000,000。

这个题一来,诶,不是简单的筛法么。。。一看数据范围,好吧,用数组直接爆了。那么不妨试试先求出根号m内的素数,然后用他们去筛出范围内的素数。下面贴出代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long long a,b,ans;
bool ss[1000005],k,s[1000005];
int main()
{
    freopen("pcount.in","r",stdin);
    freopen("pcount.out","w",stdout);
    cin>>a>>b;
    int n=(long)sqrt(b)+1;
    for(long long i=2;i<=n;i++)
    if(ss[i]==0)
    {
        for(long long j=i*i;j<=n;j+=i)
        ss[j]=1;
        for(long long j=a/i*i;j<=b;j+=i)
        if(j>i&&j>=a)
        s[j-a]=1;
    }
    for(long long i=0;a+i<=b;i++)
    if(s[i]==0)
    ans++;
    if(a==1)ans--;
    cout<<ans;
    return 0;
}

清清正正射命丸文是也~

时间: 2024-09-29 15:39:41

素数统计的相关文章

【数论+技巧】神奇的Noip模拟试题第二试 T1 素数统计

1.      素数统计 (pcount.pas/.c/.cpp) [问题描述] 小tan的老师揣谙戈给同学们布置了一道题,要求统计给定区间内素数的个数.“这不是很简单吗?”小tan忍不住说.揣谙戈冷笑一下说:“等你们看到题目就知道了.”便转身离去. 果然,小tan被那极大的区间吓怕了,现在是你拯救她的时候. [输入] 输入文件名为pcount.in. 输入一行两个正整数a和b,表示给定区间为[a,b]. [输出] 输出文件名为pcount.out. 输出一个整数,表示区间内素数数量. [输入输

关于ArrayUtil代码的优化

public int[] removeZero(int[] oldArray) { //传进空数组是返回空数组 if(oldArray == null) return null; int count = 0; //统计非零元素个数 int b[] = new int[oldArray.length]; //先统计非零元素个数,并将非零元素存入一个和原数组同样大小的新数组 for(int i=0; i < oldArray.length; i++) { if(oldArray[i] != 0) {

智能车任务四

1. 计算电池电压 设计一个程序,读入给定的电池数据文件,提取出其中的 v1~v18 组电池电压数据,并计算每行的总电压,输出“行号 总电压”. 程序仅需进行一个文件的计算,群文件中会提供一个示例 文件,但此文件仅供参考格式,数据及数据组数没有参考意义. 文件绝对路径:/home/RunSpace/4011.txt 文件权限为只读 输入:无 输出:1.格式为“行号(及 IDX) 总电压”,每行数据占 一行; 2.总电压格式输出为三位小数. 样例输入 IDX STEP WORK TIME LOOP

循环-15. 统计素数并求和

循环-15. 统计素数并求和(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 张彤彧(浙江大学) 本题要求统计给定整数M和N区间内素数的个数并对它们求和. 输入格式: 输入在一行中给出2个正整数M和N(1<=M<=N<=500). 输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔. 输入样例: 10 31 输出样例: 7 143 1 #include<stdio.h> 2

1439 筛法统计素数个数

1439 统计素数个数 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 输入区间[L, R],寻找在此区间内的质数. 输入描述 Input Description 开区间[L, R]中的整数L,R 输出描述 Output Description 在此区间中所有质数的个数n 样例输入 Sample Input 0 100 样例输出 Sample Output 25 数据范围及提示 Data Size & Hint 对于所有数

1453 统计素数个数 2

1453 统计素数个数 2 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 判断[a,b]中素数的个数 输入描述 Input Description 输入共1行,a,b两数 输出描述 Output Description 输出共1行,输出素数的个数 样例输入 Sample Input 3 5 样例输出 Sample Output 2 数据范围及提示 Data Size & Hint 对于100%的数据,a,b≤5000,000

04-3. 统计素数并求和(20)

本题要求统计给定整数M和N区间内素数的个数并对它们求和. 输入格式: 输入在一行中给出2个正整数M和N(1<=M<=N<=500). 输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔. 输入样例: 10 31 输出样例: 7 143 注:此题先统计素数,每统计到一个,计数器加1,并进行求和操作即可 #include "stdio.h" int main() { int M,N; scanf("%d %d",&

循环-15. 统计素数并求和(20)

1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 bool isPrime(int n){ 5 int i; 6 for(i=2;i<=sqrt(n);++i) 7 if(n%i==0) 8 break; 9 if(n>=2&&i>sqrt(n)) 10 return true; 11 else 12 return false; 13 } 14 int main(){ 1

素数,回文,统计单词

素数 设计思想 按照除k取余的思想,循环进行除法取余数,余数为零表示可以被其他数整出,则不是素数. package numbe; import java.util.Scanner; public class Prime { public static void main(String[] args) { int i = 0; System.out.println("1. 3-100 2. 任意两数 3. 最大十个和最小十个"); Scanner sc = new Scanner(Sys