SXYBT-0102H数

试题编号:2603 收 藏   
SXYBT-0102H数
难度级别:B; 运行时间限制:1000ms; 运行空间限制:65536KB; 代码长度限制:2000000B
试题描述

形如4n+1的数被称为“H数”,乘法在“H数”组成的集合内是封闭的。在这个集合中只能被1和本身整除的数叫做“H-素数”(不包括1),其余的数被称为“H-合数”。一个“H-合成数”是一个能且只能分解成两个“H-素数”乘积的“H-合数”(可能有多种分解方案)。比如441=21*21=9*49,所以441是“H-合成数”。125=5*5*5,所以125不是“H-合成数”。

求0到h范围内“H-合成数”的个数。

输入
输入包含若干行,每行一个小于等于1000001的整数h,输入0时表示结束。
输出
对于每一行输入,输出一个数,表示答案。
输入示例
21
85
0
输出示例
0
5

洛谷题目传送门:https://www.luogu.org/problem/show?pid=UVA11105

思路:主题思路应该是筛法吧,先筛特殊的H-素数,再通过素数找到H-合成数。我才不会告诉你我调了三个小时。

 提示:这是我们校内OJ,到洛谷上注意读题目输出要求。

直接上代码

 1 #include<bits/stdc++.h>
 2 #define MAXN 1000002
 3 using namespace std;
 4 int h;
 5 bool prime[MAXN],s[MAXN];
 6 void init(int n)//筛H-素数的函数 
 7 {
 8     for(int i=5;i<n/5;i+=4) 
 9     {
10         if(prime[i]==false)
11         {
12             for(int j=5;j*i<n;j+=4)
13             {
14                 prime[i*j]=true;
15             }
16         }
17     }  
18 }
19 
20 int main()
21 {
22     init(MAXN);
23     for(int i=5;i*i<MAXN;i+=4) //直接处理最大范围内的H-合成数 
24     {
25         if(prime[i]==false)
26         {
27             for(int j=5;i*j<MAXN;j+=4) 
28             {
29                 if(prime[j]==false) s[i*j]=true;//通过H-素数推出H-合成数
30             }
31         }
32     }  
33     while(1)
34     {
35         int ans=0;
36         scanf("%d",&h);
37         if(h==0) break;
38         for(int i=5;i<=h;i+=4) 
39         {
40             if(s[i]==true) ans++;//直接走一遍就OK了 
41         }
42         printf("%d
",ans);
43     }
44     return 0;
45 }
View Code
原文地址:https://www.cnblogs.com/jiuduSHENBENG/p/10012135.html