Semi-prime H-numbers UVA - 11105

发布时间 2023-04-11 23:25:13作者: towboat
 
所有形如4n+1(n为非负整数)的数叫H数。定义1是唯一的单位H数,
H素数是指本身不是1,且不能写成两个不是1的H数的乘积。
H-半素数是指能写成两个H素数的乘积的H数(这两个数可以相同也可以不同)。
 
例如,25是H-半素数,但125不是。
输入一个H数h(h≤1000001),输出1~h之间有多少个H-半素数。
 
 
类似埃筛法
 
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int  M=1e6+2;


int b[M+5],p[M+5],vis[M+5],tot ;
int A[M+5];
void sov(){
	int i,j,x;
	for(i=5;i<=M;i+=4){
		if(b[i]) continue;
		p[++tot]=i;
		for(j=1;j*i<=M;j+=4) b[j*i]=1;
	}

	for(i=1;i<=tot;i++)
		for(j=1;j<=tot;j++){
			if(p[i]*p[j]>M) break; 
			vis[p[i]*p[j]]=1;
		}
	
	for(i=1;i<=M;i++)
		A[i]=A[i-1]+(vis[i]);
	
	while(cin>>x,x){
		cout<<x<<' '<<A[x]<<endl;
	}
}
signed main() {
	sov();
}