题目很容易理解,只需要打表找出所有的 H H H 素数,然后打表枚举出所有满足条件的 H H H 合成数,最后用类似前缀和的方式进行累加,就可以得到答案了。
千万要注意 H H H 素数的最终个数大约为 20000 20000 20000 个左右(本人亲测),所以在枚举满足条件的 H H H 合成数时要进行优化。由于枚举 H H H 素数时是由小到大依次枚举的,所以可以在两个 H H H 素数的积大于 1000001 1000001 1000001 时停止继续枚举。
注意最后的循环一旦输入到 0 0 0 就要停止程序,避免死循环。
这种做法比较极限,不建议按照此思路做,不过这种做法更容易理解。
代码如下
#include<bits/stdc++.h>
using namespace std;
int ans[1000005]={0},a[20005];
int main()
{
int t,l=0;
for(int i=5;i*5<=1000001;i+=4)
{
bool z=0;
for(int j=5;j*j<=i;j+=4)
{
if(i%j==0&&(i/j)%4==1&&i/j!=1)
{
z=1;
break;
}
}
if(z==0)
{
l++;
a[l]=i;
}
}
for(int i=1;i<=l;i++)
{
for(int j=1;j<=l;j++)
{
if(a[i]*a[j]>1000001)
{
break;
}
else
{
ans[a[i]*a[j]]=1;
}
}
}
for(int i=1;i<=1000001;i++)
{
ans[i]=ans[i-1]+ans[i];
}
int n;
while(cin>>n)
{
if(n==0)
{
break;
}
printf("%d %d\n",n,ans[n]);
}
return 0;
}