又是一道英文题
总之就
上翻译器吧
大体解释一下原题
形如4n+1的数叫做H数
乘法在H数组成的集合内是封闭的
H数中只能被1和本身整除的数叫H素数
剩下的叫H合数
其中能且仅能分解成两个H素数的H合数叫做H合成数
给你若干个数h
求在0~h范围内的H合成数的个数
利用筛选法求出H素数
[若i是H素数,那么5i+4i*x一定是H数但不是H素数]
然后两两相乘
处理出H合成数
预处理出每个范围内的H合成数的数量
直接输出
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<ctime>
#define MAX 1000001
#define LL long long
using namespace std;
int i,j,Hprime[MAX+10],Hprime_num[MAX+10],Hmix[MAX+10],Hnum[MAX+10],n,tot;
int main()
{
for(i=5;i<=MAX;i+=4)
{
if(Hprime[i]) continue;
tot++;
Hprime_num[tot]=i;
for(j=i*5;j<=MAX;j+=i*4)
Hprime[j]=1;
}
for(i=1;i<=tot;i++)
for(j=1;j<=i&&Hprime_num[i]*Hprime_num[j]<=MAX;j++)
{
int t=Hprime_num[i]*Hprime_num[j];
Hmix[t]=1;
}
for(i=1;i<=MAX;i++)
Hnum[i]=Hnum[i-1]+Hmix[i];
scanf("%d",&n);
while(n)
{
printf("%d %d\n",n,Hnum[n]);
scanf("%d",&n);
}
return 0;
}