素数统计
sloj P4006. 素数统计
题目描述
统计区间[a,b]范围内素数的数量。
输入格式
输入一行两个正整数a和b,表示给定区间为[a,b]。
输出格式
输出一个整数,表示区间内素数数量。
样例
数据规模与约定
对于30%的数据,有n<m≤1,000;
对于60%的数据,有n<m≤1,000,000;
对于100%的数据,有n<m<2^31,m-n≤1,000,000
我们可以发现这题明显是不能直接算1~r的范围的,也很明显的是只算l~r区间是会错的
肯定会T,第二个嘛,自己想想线性筛原理应该就能明白
这是我们就可以想一想线性筛标记合数的原理,很明显,最小质(只)因子乘上当前数时,设x为他们俩的乘积,质因子一定小于√x
同样,证明就不放了,很显然嘛
所以我们只用筛2~√r的部分
上代码
#include<bits/stdc++.h> #define ll long long using namespace std; int prime[1000010],pr[1000010],vis[1000010]; ll l,r,ans = 0,cnt; void pre(){ for(int i = 2;i<=1000010;i++){ if(!vis[i]) prime[++cnt] = i; for(int j = 1;j<=cnt&&prime[j]*i<=1000010;j++){ vis[i*prime[j]] = 1; if(i%prime[j]==0) break; } } } int main(){ pre(); scanf("%lld%lld",&l,&r); for(ll i = 1;i<=cnt;i++) for(ll j = max(1ll,(l-1)/prime[i])*prime[i]+prime[i];j<=r;j+=prime[i]) pr[j-l] = 1; for(ll i = max(2ll,l);i<=r;i++) ans+=pr[i-l]?0:1; printf("%lld",ans); return 0; }
梦与现实间挣扎着,所求为何
你可以借走我的文章,但你借不走我的智慧 虽然我是傻逼本文来自博客园,作者:cztq,转载请注明原文链接:https://www.cnblogs.com/cztq/p/16945689.html

浙公网安备 33010602011771号