讨论 / 第一个点为什么过不了啊
zzqq2199 2012-10-05 01:53:00
点我顶贴 收藏 删除
//第一个点标准答案是1 我的答案是2

var

ans,i,k,n,x,y,a0,a1,b0,b1:longint;

c:array[0..100000] of longint;

procedure closes; begin halt; end;

function ys(a,b:longint):longint;

var x:longint;

begin

x:=a mod b;

while x>0 do

begin

a:=b; b:=x; x:=a mod b;

end;

exit(b);

end;

begin

readln(n);

for k:=1 to n do begin

ans:=0;

readln(a0,a1,b0,b1);

x:=a0 div a1; y:=b1 div b0;

fillchar(c,sizeof(c),0);

for i:=1 to trunc(sqrt(b1)) do begin

if b1 mod i=0 then

begin

inc(c[0]);

c[c[0]]:=i;

inc(c[0]);

c[c[0]]:=b1 div i;

end;

end;

for i:=1 to c[0] do begin

if c[i] mod a1 <>0 then continue;

if ys(c[i] div a1,x)=1 then

if ys(b1 div c[i],y)=1 then

begin

inc(ans);

//writeln(n,c[i]:5,c[i] mod a1:5);

end;

end;

writeln(ans);

end;

end.

#1 jiangzh@2012-10-05 01:53:00
回复 删除
这种朴素方法pascal能过的

RT,

你算重复了b1 div c[i]=c[i]的时候,加一个判断就行了

现在突然感觉pascal怎么比C++快。。。。C++这种方法最后一组要超时。。。

查看更多回复
提交回复