CRUELL - Cô giáo dạy toán, phần I
Tác giả: RR
Ngôn ngữ: Pascal
{$R-,Q-}
{$Mode objFPC}
uses math;
const
FINP='';
FOUT='';
MAXN=15000;
oo=1000000000;
type
big=array[0..MAXN] of int64;
var
f1,f2:text;
s:ansistring;
n,p:longint;
nn,now:big;
procedure openF;
begin
assign(f1,FINP); reset(f1);
assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
close(f1); close(f2);
end;
procedure inp;
begin
readln(f1,n,p);
end;
procedure nhan(a,b:big; var c:big); inline;
var
i,j:longint;
nho:int64;
begin
fillchar(c,sizeof(c),0);
c[0]:=a[0]+b[0]-1;
for i:=1 to a[0] do
for j:=1 to b[0] do
begin
c[i+j-1]+=int64(a[i])*b[j];
if c[i+j-1]>oo then
begin
c[i+j]+=c[i+j-1] div oo;
c[i+j-1]:=c[i+j-1] mod oo;
end;
end;
if c[c[0]+1]>0 then inc(c[0]);
nho:=0;
for i:=1 to c[0] do
begin
c[i]+=nho;
nho:=c[i] div oo;
c[i]:=c[i] mod oo;
end;
while nho>0 do
begin
inc(c[0]);
c[c[0]]:=nho mod oo;
nho:=nho div oo;
end;
end;
procedure nhank(var a:big; k:longint); inline;
var
i:longint;
nho:int64;
begin
nho:=0;
for i:=1 to a[0] do
begin
a[i]:=a[i]*k+nho;
nho:=a[i] div oo;
a[i]:=a[i] mod oo;
end;
while nho>0 do
begin
inc(a[0]);
a[a[0]]:=nho mod oo;
nho:=nho div oo;
end;
end;
procedure solve;
var
i,dx:longint;
begin
nn[0]:=1; nn[1]:=n; now:=nn;
i:=1;
while i<<1 <p do
begin
i:=i<<1;
nn:=now;
nhan(nn,nn,now);
end;
dx:=i;
for i:=dx+1 to p do
nhank(now,n);
end;
procedure ans;
var
i:longint;
ss:string;
begin
str(now[now[0]],s);
for i:=now[0]-1 downto 1 do
begin
str(now[i],ss);
while length(ss)<9 do ss:='0'+ss;
s:=s+ss;
end;
while length(s)>70 do
begin
ss:=copy(s,1,70);
writeln(f2,ss);
delete(s,1,70);
end;
writeln(f2,s);
end;
begin
openF;
inp;
solve;
ans;
closeF;
end.