poj 3292 H-素数问题 扩展艾氏筛选法
题意:形似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", n, num[n]); } return 0; }
君子知命不惧,自当日日自新
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步