NC235228 素数的个数
作者:互联网
https://ac.nowcoder.com/acm/problem/235228
思路:用线性筛筛出\(\sqrt r\)以内的质数,再筛出区间L~R的质数。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int cnt = 0;
bool vis[1000004];
int prim[50004];
void sieve(int n)
{
vis[1] = 1;
for(int i=2;i<=n;++i)
{
if(vis[i]==0) prim[++cnt] = i;
for(int j=1;j<=cnt&&i*prim[j]<=n;++j)
{
vis[i*prim[j]] = 1;
if(i%prim[j]==0) break;
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
sieve(50000);
long long l ,r;
cin >> l >> r;
memset(vis, 0, sizeof vis);
for(int i=1;i<=cnt;++i)
{
long long p = prim[i],start = (l+p-1)/p*p; //p是大于等于L的第一个当前质数的倍数
if(2*p>start) start = 2 * p; //判断一下L是当前的质数的情况
for(long long j=start;j<=r;j+=p) vis[j-l+1] = 1; //将合数标记为1
}
int ans = 0;
for(int i=1;i<=r-l+1;++i)
if(!vis[i]) ans++;
cout << ans << endl;
return 0;
}
标签:start,int,筛出,质数,个数,long,vis,素数,NC235228 来源: https://www.cnblogs.com/beiy/p/16460091.html