poj 3292 Semi-prime H-numbers

题意: 
一个H-number是所有的模四余一的数。(x=4*k+1) 
如果一个H-number是H-primes 当且仅当它的因数只有1和它本身(除1外)。
一个H-number是H-semi-prime当且仅当它只由两个H-primes的乘积表示。
H-number剩下其他的数均为H-composite。
给你一个数h,问1到h有多少个H-semi-prime数。

 

Sample Input

 

21 
85
789
0

 

Sample Output

 

21 0
85 5
789 62
刷水题练手
首先一个数i是H数,那么i(4x+1)也是H数,且是H合数
显然x不能为0
因为i%4=1,(4x+1)%4=1
复杂度是o(N/4*(lnN/4)/4)≈800000
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 typedef long long lol;
 8 bool b[1000002];
 9 int semi[1000002];
10 lol ans[1000002]; 
11 int main()
12 {lol i,j;
13 int x;
14   for (i=5;i<=1000001;i+=4)
15     {
16       for (j=5;j*i<=1000001;j+=4)
17     {
18       if (semi[i]==0&&semi[j]==0)
19         semi[i*j]=1;
20       else semi[i*j]=-1;
21     }
22     } 
23   for (i=1;i<=1000001;i++)
24     if (semi[i]==1)
25     ans[i]=ans[i-1]+semi[i];
26     else ans[i]=ans[i-1];
27   while (cin>>x && x)
28     {
29       printf("%d %lld\n",x,ans[x]);
30     }
31 }

 


 

posted @ 2017-12-20 15:30  Z-Y-Y-S  阅读(138)  评论(0编辑  收藏  举报