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.

Download