您的位置:首页 > 其它

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

2016-03-02 20:57 375 查看
http://poj.org/problem?id=3292

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

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

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

筛法,各种筛.....

Program poj3292;

const maxh=1000001 div 4+1;

var h,le,lq:longint;

a:array[1..maxh]of boolean;

p,q:array[1..maxh]of longint;

f:array[0..maxh]of longint;

Procedure initprimegram;

var i,j,k:longint;

begin

fillchar(a,sizeof(a),true);

for i:=1 to maxh do

if a[i] then

begin

inc(le);

p[le]:=i;

for j:=1 to maxh do

begin

if ((i*4+1)*(j*4+1)>(maxh+1)*4) then break;

if ((i*4+1)*(j*4+1)-1) mod 4=0 then

a[((i*4+1)*(j*4+1)-1) div 4]:=false;

end;

end;

for i:=1 to maxh do

if a[i]=false then begin inc(lq);q[lq]:=i;end;

fillchar(a,sizeof(a),false);

for i:=1 to le do

for j:=i to le do

begin

if (int64(p[i])*4+1)*(p[j]*4+1)>(maxh+1)*4 then break;

a[((p[i]*4+1)*(p[j]*4+1)-1) div 4]:=true;

end;

for i:=1 to lq do

for j:=1 to maxh do

begin

if (int64(q[i])*4+1)*(j*4+1)>(maxh+1)*4 then break;

a[((q[i]*4+1)*(j*4+1)-1)div 4]:=false;

end;

for i:=1 to maxh do

begin

if a[i] then f[i]:=f[i-1]+1 else f[i]:=f[i-1];

end;

end;

Begin

assign(input,'input.in');assign(output,'output.out');

reset(input);rewrite(output);

initprimegram;

readln(h);

while h<>0 do

begin

writeln(h,' ',f[h div 4]);

readln(h);

end;

close(input);close(output);

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: