题目:
【问题描述】
小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