标题被影日收割了

模拟赛题

当一个正整数的质因子个数为质数时,它被称为 “质数中的质数”,现在给出 l,r ,你需要求出有多少个 “质数中的质数” 在区间 [l,r] 中。

心路历程:
想单纯的记录质数,然后质因数分解(赛后回顾我好像发明了埃式筛)

哦,只能得10分

打表

浪费了很多时间,最后用不超过文件大小限制的代码得了 40 分

普遍的 80 分 :

线性筛扫一边 1r 的质数,质因数分解时 , 记录分解过的数的质因子个数

线性筛 :

void Prime(int n){
	memset(isprime,1,sizeof(isprime));
	isprime[1]=0;
	for(int i=2;i<=n;i++){
		if(isprime[i])prime[++cnt]=i;
		for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
			isprime[i*prime[j]]=0;
			if(i%prime[j]==0)break;
		}
	}
}

100分 :
每次枚举质数 p , 在 lr 中找到第一个 p 的倍数的位置 , 每次跳 p , 统计质因子的个数 , 顺便做一下埃式筛
复杂度 (rl)log(rl)

#include <bits/stdc++.h>
using namespace std;
const int N=31622;
int ys[1000006],cnt[1000006];
bool vis[N+2];
int main(){
	int l,r;
	cin>>l>>r;
	for(int i=l;i<=r;i++){
		ys[i-l]=i;
	}
	vis[0]=1;
	vis[1]=1;
	for(int i=2;i<=N;i++){
		if(!vis[i]){
			for(int j=(l+i-1)/i*i;j<=r;j+=i){
				int k=ys[j-l];
				while(k%i==0){
					cnt[j-l]++;
					k/=i;
				}
				ys[j-l]=k;
			}
		}
		for(int p=i*2;p<=N;p+=i)vis[p]=1;	
	}
	int ans=0;
	for(int i=l;i<=r;i++){
		if(ys[i-l]!=1)cnt[i-l]++;
		if(!vis[cnt[i-l]])ans++;
	}
	cout<<ans; 
	return 0;
}


有一道题是一个套路

素数密度
给定 L,R ,请计算区间 [L,R] 中素数的个数。
1<=L<=R<231,RL<=106

R 太大 , 但 RL 很小 ,
先筛出 1R 的质数 , 再用他们把 LR 的合数筛出来

为什么是 1R

假设 n=ab,a<=b,a 为质数
就完了

posted @   小惰惰  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
/* 鼠标点击求赞文字特效 */
点击右上角即可分享
微信分享提示