您的位置:首页 > 其它

SGU 499 Greatest Greatest Common Divisor

2012-03-09 16:03 295 查看
给定N个数,每两个数有一个最大公约数,求最大的最大公约数。N<=10^5,每个数<=10^6

枚举求是N^2*logN的,必定超时

换一个思考的角度,如果我们假设最大公约数是多少,用多少时间可以判定是否成立呢?

假设判定x,那么给变量每次加x,看有没有这个值,有的话就计数器加一,计数器一旦大于1,就成立,跳出即可。

这样,我们开一个10^6的数组,v[i]记录值为i的数的个数,判定有没有值时就是O(1)的了,总体时间在max_number*logN左右

View Code

program sgu499(input,output);
var
v     : array[0..1100000] of longint;
n,max : longint;
procedure init;
var
i,x : longint;
begin
fillchar(v,sizeof(v),0);
max:=0;
readln(n);
for i:=1 to n do
begin
readln(x);
inc(v[x]);
if x>max then
max:=x;
end;
end; { init }
function check(x :longint ):boolean;
var
s,sum : longint;
begin
s:=0;
sum:=x;
while (sum<=max) do
begin
s:=s+v[sum];
if s>1 then
begin
check:=true;
exit;
end;
sum:=sum+x;
end;
check:=false;
end; { check }
procedure main;
var
i : longint;
begin
for i:=max downto 1 do
if check(i) then
begin
writeln(i);
break;
end;
end; { main }
begin
init;
main;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: