列表

详情


NC224933. 漂亮数

描述

小红定义一个数满足以下条件为“漂亮数”:

1. 该数不是素数。
2. 该数可以分解为2个素数的乘积

4 是漂亮数,因为 4=2*2
21 是漂亮数,因为 21=3*7
30 不是漂亮数,因为 30=2*3*5
73 不是漂亮数。因为 73 本身即是素数。
输入  和  ,请你输出  闭区间中有多少个漂亮数。

输入描述

第一行输入一个正整数  ,代表有  次询问
两个正整数 ,用空格隔开。


输出描述

共输出  行,每行为一个整数,代表  到  中漂亮数的数量。

示例1

输入:

1
150 200

输出:

12

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1306ms, 内存消耗: 806412K, 提交时间: 2022-08-13 17:49:24

#include<stdio.h>
const int N=1e8+10;
int pri[N],pre[N],cnt;
int st[N];
void init()
{
	for(int i=2; i<=1e8; i++)
	{
		if(st[i]==0)pri[cnt++]=i;
		pre[i]=pre[i-1];
		if(st[i]==1)
		{
			pre[i]++;
		}
		for(int j=0; pri[j]<=1e8/i; j++)
		{
			st[i*pri[j]]=st[i]+1;
			if(i%pri[j]==0)break;
		}
	}
}
int main()
{
	init();
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		printf("%d\n",pre[r]-pre[l-1]);
	}
}

C++ 解法, 执行用时: 2572ms, 内存消耗: 806556K, 提交时间: 2022-07-20 18:49:45

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e8+10;
int a[N],v[N],c,sum[N],l,r;

void sushu(){
	for(int i=2;i<=1e8;i++){
		if(v[i]==0) a[++c]=i;
		sum[i]=sum[i-1];
		if(v[i]==1) sum[i]++; 
		for(int j=1;i*a[j]<=1e8;j++){
			v[i*a[j]]=v[i]+1;
			if(i%a[j]==0) break;
		}
	}
	
}
int main(){
	int t;
	cin>>t; 
	sushu();
	while(t--){
		cin>>l>>r;
	cout<<sum[r]-sum[l-1]<<endl; 
	}
	return 0;
}

上一题