题目:
题目链接:Semi-prime H-numbers
题解:
一个线性筛的变式题,还是很推荐做一下的。
代码:
#include<bits/stdc++.h>
using namespace std;
const int sea=1000001+16;
int h,n;
int sum[sea],prim[sea];
bool v[sea],vis[sea];
void yuchuli()
{
for(int i=5;i<sea;i+=4)//线性筛
{
if(v[i]) continue;
prim[++n]=i;
for(int j=i*5;j<sea;j+=i*4)v[j]=1;
}
for(int i=1;i<=n;i++)//暴力乘
for(int j=1;j<=i&&prim[i]*prim[j]<sea;j++)
vis[prim[i]*prim[j]]=1;
for(int i=1;i<sea;i++) sum[i]=sum[i-1]+vis[i];
//前缀和统计答案
}
int main()
{
yuchuli();
scanf("%d",&h);
while(h)
{
printf("%d %d\n",h,sum[h]);
scanf("%d",&h);
}
return 0;
}