Đề bài: http://vn.spoj.com/problems/CRYPTKEY/
Thuật toán:
- (đang cập nhập)
Code
const
fi='';
fo='';
maxn=50003;
var
a : array[1..maxn] of int64;
b : array[1..maxn] of int64;
c : array[1..100000] of int64;
uoc : array[1..100000] of int64;
sl : array[1..100000] of longint;
i,j,n,t,tt : longint;
duoc : longint;
kt : boolean;
res,k : int64;
procedure enter;
begin
assign(input,fi);reset(input);
assign(output,fo);rewrite(output);
end;
procedure pt(x : int64);
var i,j,dem : longint;
begin
for i:=2 to trunc(sqrt(x)) do
if x mod i = 0 then
begin
dem := 0;
while x mod i = 0 do
begin
inc(dem);
x := x div i;
end;
duoc := duoc +1;
uoc[duoc] := i;
sl[duoc] := dem;
end;
if x>1 then
begin
inc(duoc);
uoc[duoc] := x;
sl[duoc] := 1;
end;
end;
function power(x,y:longint):int64;
var i : longint;
begin
power:=1;
for i:=1 to y do power := power * x;
end;
function gcd(a,b : int64) : int64;
var r : int64;
begin
while b<>0 do
begin
r := a mod b;
a:=b;
b:=r;
end;
exit(a);
end;
function lcm(a,b : int64) : int64;
var x,y : int64;
begin
{x := a; y:=b;}
lcm := (a div gcd(a,b)) *b;
end;
procedure sol;
var i,j : longint;
tg : int64;
dem : longint;
begin
read(t);
for tt :=1 to t do
begin
fillchar(a,sizeof(a),0);
fillchar(uoc,sizeof(uoc),0);
fillchar(sl,sizeof(sl),0);
kt := true;
read(n);
for i:=1 to n do read(a[i]);
readln(k);
pt(k);
for i:=1 to duoc do
begin
tg := power(uoc[i],sl[i]);
dem := 0;
for j:=1 to n do
if a[j] mod tg = 0 then
begin
inc(dem); b[dem] := a[j];
end;
if dem=0 then begin kt := false; break; end;
tg := b[1];
for j:=2 to dem do
tg := gcd(tg,b[j]);
c[i] := tg;
end;
if not kt then begin writeln('NO'); continue; end;
res := c[1];
for i:=2 to duoc do res := lcm(res,c[i]);
if res=k then
writeln('YES') else writeln('NO');
end;
close(input);close(output);
end;
begin
enter;
sol;
end.
Speak Your Mind