讨论 / 这题真有意思!朴素的pascal能过,c++过不了
jiangzh 2012-10-05 01:44:00
点我顶贴 收藏 删除
纯朴素方法,从1到根号b1依次找,C++一组超时,改成pascal居然过了!

Pascal

有效耗时: 2484毫秒

测试结果1: 通过本测试点|有效耗时187ms

测试结果2: 通过本测试点|有效耗时172ms

测试结果3: 通过本测试点|有效耗时156ms

测试结果4: 通过本测试点|有效耗时172ms

测试结果5: 通过本测试点|有效耗时172ms

测试结果6: 通过本测试点|有效耗时172ms

测试结果7: 通过本测试点|有效耗时203ms

测试结果8: 通过本测试点|有效耗时203ms

测试结果9: 通过本测试点|有效耗时375ms

测试结果10: 通过本测试点|有效耗时672ms

program son;

uses math;

var

n,a0,a1,b0,b1:longint;

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

begin

if b=0 then exit(a);

exit(gcd(b,a mod b));

end;

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

var sum:longint;

begin

sum:=a div gcd(a,b)*b;

exit(sum);

end;

procedure work;

var i,ans,x:longint;

begin

read(a0,a1,b0,b1);

ans:=0;

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

begin

if(b1 mod i <>0)then continue;

if (gcd(i,a0)=a1)and(lcm(i,b0)=b1)then inc(ans);

x:=b1 div i;

if(x=i) then continue;

if (gcd(x,a0)=a1)and(lcm(x,b0)=b1)then inc(ans);

end;

writeln(ans);

end;

procedure readdata;

var i:longint;

begin

read(n);

for i:=1 to n do

work;

end;

begin

//init;

readdata;

//outit;

end.

C++

测试结果1: 通过本测试点|有效耗时78ms

测试结果2: 通过本测试点|有效耗时62ms

测试结果3: 通过本测试点|有效耗时47ms

测试结果4: 通过本测试点|有效耗时47ms

测试结果5: 通过本测试点|有效耗时47ms

测试结果6: 通过本测试点|有效耗时63ms

测试结果7: 通过本测试点|有效耗时109ms

测试结果8: 通过本测试点|有效耗时172ms

测试结果9: 通过本测试点|有效耗时719ms

测试结果10: 选手程序运行超过时限

#include<cstdio>

#include<cmath>

using namespace std;

int a,aa,b,bb,ans;

int gcd(int a,int b) { return b==0?a:gcd(b,a%b); }

int lcm(int a,int b) { return a/gcd(a,b)*b; }

void work()

{

scanf("%d%d%d%d",&a,&aa,&b,&bb);

ans=0;

for(int i=1;i<=(int)sqrt(bb);i++)

{

if(gcd(i,a)==aa && lcm(i,b)==bb) ans++;

int x=bb/i;

if(x!=i && gcd(x,a)==aa && lcm(x,b)==bb) ans++;

}

printf("%d\n",ans);

}

int main()

{

//freopen("son.in","r",stdin);

//freopen("son.out","w",stdout);

int groups;

scanf("%d",&groups);

for(int i=1;i<=groups;i++)

work();

return 0;

}

查看更多回复
提交回复