Listing CANISTRE.PAS
Program Canistre;
Var nr1,nr2,nr3,a,b,c,n,k:Longint;
cont,lb:Longint;
f:Text;
gasit:Boolean;
Function Cmmdc(a,b:Longint):Longint;
begin
if a*b=0
then if a<>0 then Cmmdc:=a
else Cmmdc:=b
else if a>b
then Cmmdc:=Cmmdc(b,a-(a div b)*b)
else Cmmdc:=Cmmdc(a,b-(b div a)*a)
end;
Begin
Assign(f,'CANA.IN'); Reset(f);
Readln(f,n); Readln(f,a,b);
Close(f);
nr1:=0; nr2:=0;
Assign(f,'CANA.OUT');
if n=0
then
begin Rewrite(f); Close(f); Exit end;
if n=b
then
begin
Rewrite(f);
Writeln(f,'UB');
Close(f);
Exit
end;
if (Cmmdc(a,b)<>1) and (n mod Cmmdc(a,b)<>0)
then
begin
Rewrite(f);
Writeln(f,'NU');
Close(f);
Exit
end;
c:=0;
while c<>n do
begin
nr1:=nr1+2;
if c+a>b then nr1:=nr1+2;
c:=(c+a) mod b;
if c=0 then c:=b
end;
c:=0;
gasit:=false;
while (nr2<nr1) and not gasit do
begin
nr2:=nr2+1;
nr2:=nr2+2*((b+c) div a);
nr2:=nr2+1;
c:=(c+b) mod a;
lb:=b+c;
nr3:=0;
while lb>n do
begin
lb:=lb-a;
nr3:=nr3+1
end;
if lb=n
then
begin
gasit:=true;
nr2:=nr2+1+2*(nr3-1)+1
end
end;
if nr2<nr1
then
begin
Rewrite(f);
c:=0; cont:=nr2;
gasit:=false;
while not gasit do
begin
Writeln(f,'UB');
for k:=1 to (b+c) div a do
begin
Writeln(f,'BA'); Writeln(f,'GA')
end;
Writeln(f,'BA');
c:=(c+b) mod a;
lb:=b+c; nr3:=0;
while lb>n do
begin
lb:=lb-a; nr3:=nr3+1
end;
if lb=n
then
begin
gasit:=true;
Writeln(f,'UB');
for k:=1 to nr3-1 do
begin
Writeln(f,'BA'); Writeln(f,'GA')
end;
Writeln(f,'BA')
end
end;
Close(f)
end
else
begin
cont:=nr1;
Rewrite(f);
c:=0;
while c<>n do
begin
Writeln(f,'UA');
Writeln(f,'AB');
if c+a>b
then
begin
Writeln(f,'GB');
Writeln(f,'AB')
end;
c:=(c+a) mod b;
if c=0 then c:=b
end;
Close(f)
end
End.