讨论 / 求解啊
小学生Yip 2012-07-27 22:21:00
点我顶贴 收藏 删除
program fenjie;

const

n=2000000000;

q=trunc(sqrt(n));

p=4648;

var

i,j,s,a0,a1,b0,b1:longint;

m,y,m1:integer;

judge:boolean;

d:array[1..p,1..4]of 1..31;

e:array[1..4]of longint;

c:array[1..q]of integer;

b:array[1..q]of boolean;

a:array[1..p]of longint;

procedure fenjie(x:longint);//把一个数分解成sqrt(2000000000)以内的质因子

var

i:longint;

begin

if x=1 then exit;

if x>q then

for i:=1 to p do

if x mod a[i]=0 then

begin

inc(d[i,y]);

fenjie(x div a[i]);

exit;

end else

else if x=a[c[x]] then

begin

inc(d[x,y]);

exit;

end else

for i:=1 to c[x] do

if x mod a[i]=0 then

begin

inc(d[i,y]);

fenjie(x div a[i]);

exit;

end;

e[y]:=x;

end;

begin

fillchar(b,sizeof(b),true);//用筛法找出sqrt(2000000000)以内的质因子

for i:=2 to q do

if b[i] then

begin

for j:=i+1 to q do

if b[j] then

if j mod i=0 then b[j]:=false;

end;

j:=0;

for i:=2 to q do

begin

if b[i] then

begin

inc(j);

a[j]:=i;

end;

c[i]:=j;

end;

readln(m);

for m1:=1 to m do//每步程序主体

begin

judge:=false;

fillchar(d,sizeof(d),0);

fillchar(e,sizeof(e),0);

read(a0);read(a1);read(b0);readln(b1);

if b1 mod a1 >0 then begin writeln(0); continue; end;

y:=1;fenjie(a0);

y:=2;fenjie(a1);

y:=3;fenjie(b0);

y:=4;fenjie(b1);

s:=1;

if (e[2]=0)and(e[3]=e[4])and(e[3]>0)and(e[1]<>e[3]) then s:=2;

for i:=1 to p do

if (d[i,1]>d[i,2])and(d[i,3]<d[i,4])and(d[i,4]>d[i,2]) then

begin writeln(0); judge:=true; break; end else

if (d[i,1]=d[i,2])and(d[i,3]=d[i,4]) then

s:=s*(d[i,4]-d[i,2]+1);

if judge then continue;

writeln(s);

end;

end.

//每次只过前2点,后面总是算多.

#1 zzqq2199@2012-07-27 22:21:00
回复 删除
你们真有耐心哇

查看更多回复
提交回复