题意:形似4n+1的被称作H-素数,两个H-素数相乘得到H-合成数。求h范围内的H-合成数个数
思路:
h-素数 h-合成数
for(int i=5;i<maxn;i+=4) for(int i=5;i<maxn;i+=4)
{ if(h_prime[i]) continue; for(int j=5;j<maxn;j+=4){
for(int j=i*5;j<maxn;j+=i*4) h_prime[j]=1; } if(i*j>maxn) break; if(!h_prime[i]&&!h_prime[j]) h_sei[i*j]=1;}
注:这里的1反而不是h-素数
解决问题的代码:
#include <iostream> #include <cstdio> using namespace std; #define maxn 1000010 int h_prime[maxn], h_sei[maxn], num[maxn]; void table() { h_prime[1] = 0; for (int i = 5; i < maxn; i += 4) { if (h_prime[i]) continue; for (int j = i * 5; j < maxn; j += i * 4) h_prime[j] = 1; } for(int i=5;i<maxn;i+=4) for (int j = 5; j < maxn; j += 4) { if (i*j > maxn) break; if (!h_prime[i] && !h_prime[j]) h_sei[i*j] = 1; } int ans = 0; for (int i = 5; i < maxn; i++) { if (h_sei[i]) num[i] = ++ans; else num[i] = ans; } } int main() { int n; table(); while (scanf("%d", &n)!=EOF) { if (n == 0) break; printf("%d %d ", n, num[n]); } return 0; }