poj3292 Semi-prime H-numbers 2012-09-05

http://poj.org/problem?id=3292 

 

题意:H-number:  所有4的倍数加1    如 1 5 9 13.....

          H-prime: 因子除了1,没有其他因子为H-number

          H-semi-prime: 只能拆成两个 H-prime的乘积,方案可以有多种,但只能拆成两个。  

 

筛法,各种筛.....

  1 Program poj3292;
  2 
  3 const maxh=1000001 div 4+1;
  4 
  5 var h,le,lq:longint;
  6 
  7     a:array[1..maxh]of boolean;
  8 
  9     p,q:array[1..maxh]of longint;
 10 
 11     f:array[0..maxh]of longint;
 12 
 13 
 14   Procedure initprimegram;
 15 
 16   var i,j,k:longint;
 17 
 18    begin
 19 
 20 
 21         fillchar(a,sizeof(a),true);
 22 
 23 
 24         for i:=1 to maxh do
 25 
 26           if a[i] then
 27 
 28              begin
 29 
 30                 inc(le);
 31 
 32                 p[le]:=i;
 33 
 34                 for j:=1 to maxh do
 35 
 36                  begin
 37 
 38                    if ((i*4+1)*(j*4+1)>(maxh+1)*4) then break;
 39 
 40                    if ((i*4+1)*(j*4+1)-1) mod 4=0 then
 41 
 42                         a[((i*4+1)*(j*4+1)-1) div 4]:=false;
 43 
 44                  end;
 45 
 46              end;
 47 
 48         for i:=1 to maxh do
 49 
 50           if a[i]=false then begin inc(lq);q[lq]:=i;end;
 51 
 52         fillchar(a,sizeof(a),false);
 53 
 54         for i:=1 to le do
 55 
 56          for j:=i to le do
 57 
 58            begin
 59 
 60               if (int64(p[i])*4+1)*(p[j]*4+1)>(maxh+1)*4 then break;
 61 
 62               a[((p[i]*4+1)*(p[j]*4+1)-1) div 4]:=true;
 63 
 64            end;
 65 
 66         for i:=1 to lq do
 67 
 68          for j:=1 to maxh do
 69 
 70           begin
 71 
 72              if (int64(q[i])*4+1)*(j*4+1)>(maxh+1)*4 then break;
 73 
 74              a[((q[i]*4+1)*(j*4+1)-1)div 4]:=false;
 75 
 76           end;
 77 
 78         for i:=1 to maxh do
 79 
 80           begin
 81 
 82              if a[i] then f[i]:=f[i-1]+1 else f[i]:=f[i-1];
 83 
 84           end;
 85 
 86 
 87    end;
 88 
 89 
 90 Begin
 91 
 92    assign(input,'input.in');assign(output,'output.out');
 93 
 94    reset(input);rewrite(output);
 95 
 96        initprimegram;
 97 
 98        readln(h);
 99 
100        while h<>0 do
101 
102         begin
103 
104           writeln(h,' ',f[h div 4]);
105 
106           readln(h);
107 
108         end;
109 
110    close(input);close(output);
111 
112 end.

 

posted on 2016-03-02 20:57  Yesphet  阅读(141)  评论(0编辑  收藏  举报