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 }