首页 > 其他分享 >P1835

P1835

时间:2024-10-08 18:49:18浏览次数:8  
标签:int 然后 vis maxn long P1835

终于想起来发博客了,呃呃呃呃呃呃
这题不难,但要看到 1≤L≤R<231和R−L≤106
我们可以考虑先把<216的素数先筛出来,然后再把区间里的合数筛光。
然后……就没有然后了。
上代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5e5+5;
int l,r;
int prime[maxn],cnt,ans;
bool vis[maxn];
inline void s() {
	for(int i=2; i<=50000; ++i) {
		if(!vis[i])prime[++cnt]=i;
		for(int j=1; i*prime[j]<=50000; j++) {
			vis[i*prime[j]]=1;
			if(i%prime[j]==0) break;
		}
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin>>l>>r;
	l=(l==1?2:l);//sb hack 
	s();
	memset(vis,0,sizeof(vis));
	for(int i=1; i<=cnt; ++i) {
		int p=prime[i],start=(l+p-1)/p*p>2*p?(l+p-1)/p*p:2*p;
		for(int j=start; j<=r; j+=p)vis[j-l+1]=1;
	}
	for(int i=1; i<=r-l+1; ++i)if(!vis[i])ans++;
	cout<<ans;
}

标签:int,然后,vis,maxn,long,P1835
From: https://www.cnblogs.com/zan-mei-tai-yang/p/18452296

相关文章

  • 洛谷题单指南-数学基础问题-P1835 素数密度
    原题链接:https://www.luogu.com.cn/problem/P1835题意解读:要计算L-R范围内素数的个数。解题思路:直接对L~R的每个数判断素数肯定不可取,因为L、R的范围较大。既然要计算素数的个数,那么可以把其中的合数标记出来即可。如何标记合数?可以借助于筛素数的算法思想,枚举每一个素数,然......
  • P1835 素数密度
    给定区间[L,R](1≤R<(1<<30) R−L≤1e6),请计算区间中素数的个数。筛出sqrt(R)的质数p,遍历L~R的数,看能否被p约分,也就是合数,打个标记 #include<iostream>#include<cstring>#include<cmath>#include<algorithm>usingnamespacestd;constintM=1e6+30;......
  • 洛谷P1835-素数密度
    素数密度题目描述给定区间\([L,R]\)(\(1\leqL\leqR<2^{31}\),\(R-L\leq10^6\)),请计算区间中素数的个数。输入格式第一行,两个正整数\(L\)和\(R\)。输出格式一行......