POJ3292-Semi-prime H-numbers

转载请注明出处:優YoU   http://user.qzone.qq.com/289065406/blog/1309336489

 

大致题意:

一个H-number是所有的模四余一的数。

如果一个H-numberH-primes 当且仅当它的因数只有1和它本身(除1外)。

一个H-numberH-semi-prime当且仅当它只由两个H-primes的乘积表示。

H-number剩下其他的数均为H-composite

给你一个数h,1h有多少个H-semi-prime数。

 

解题思路:

感觉跟同余模扯不上关系。。。

筛法打表,再直接输出。。。水题。。。

 1 //Memory Time 
2 //4172K 63MS
3
4 #include<iostream>
5 using namespace std;
6
7 const int size=1000001;
8
9 int H_Number[size+1];
10
11 /*筛法打表*/
12 void Table(void)
13 {
14 memset(H_Number,0,sizeof(H_Number)); //H_Number[i]=0 表示 i为H-prime
15
16 for(int i=5;i<=size;i+=4)
17 {
18 for(int j=5;j<=size;j+=4)
19 {
20 int multiply=i*j;
21 if(multiply>size)
22 break;
23
24 if(H_Number[i]==0 && H_Number[j]==0) //i与j均为H-prime
25 H_Number[multiply]=1; //multiply为H-semi-primes
26 else
27 H_Number[multiply]=-1; //multiply为H-composite
28 }
29 }
30
31 int Pcount=0; //H-prime计数器
32 for(int k=1;k<=size;k++)
33 {
34 if(H_Number[k]==1)
35 Pcount++;
36 H_Number[k]=Pcount; //从1到k有Pcount个H-semi-primes
37 }
38 return;
39 }
40
41 int main(void)
42 {
43 Table();
44 int h;
45 while(cin>>h && h)
46 cout<<h<<' '<<H_Number[h]<<endl;
47
48 return 0;
49 }

你可能感兴趣的:(number)