CRUELL - Cô giáo dạy toán, phần I

Tác giả: ll931110

Ngôn ngữ: Pascal

program cruell;
const
  input  = '';
  output = '';
  maxd = 1700;
  base = round(1e9);
type
  arr = array[1..maxd] of qword;
var
  res,ss: arr;
  n,p: longint;

procedure init;
var
  f: text;
begin
  assign(f, input);
    reset(f);
    readln(f, n, p);
  close(f);
end;

procedure genbase;
begin
  fillchar(ss, sizeof(ss), 0);
  ss[1] := n;
  if ss[1] >= base then
    begin
      ss[2] := ss[1] div base;
      ss[1] := ss[1] mod base;
    end;
end;

function mul(x,y: arr): arr;
var
  i,j: longint;
  z: arr;
begin
  fillchar(z, sizeof(z), 0);
  for i := 1 to maxd do
    for j := 1 to maxd do
      if (x[i] <> 0) and (y[j] <> 0) then
        begin
          z[i + j - 1] := z[i + j - 1] + x[i] * y[j];
          if z[i + j - 1] >= base then
            begin
              z[i + j] := z[i + j] + z[i + j - 1] div base;
              z[i + j - 1] := z[i + j - 1] mod base;
            end;
        end;

  for i := 1 to maxd do if z[i] >= base then
    begin
      z[i + 1] := z[i + 1] + z[i] div base;
      z[i] := z[i] mod base;
    end;

  mul := z;
end;

function pow(x,p: longint): arr;
var
  q: arr;
begin
  if p = 1 then exit(ss);
  q := pow(x,p div 2);
  q := mul(q,q);
  if odd(p) then q := mul(q,ss);
  pow := q;
end;

procedure printresult;
var
  f: text;
  i,j,k: longint;
  endl: longint;
  s: string;
begin
  res := pow(n,p);

  assign(f, output);
    rewrite(f);

  i := maxd;
  while res[i] = 0 do dec(i);

  str(res[i],s);
  endl := length(s);
  write(f, s);

  for j := i - 1 downto 1 do
    begin
      str(res[j],s);
      for k := 1 to 9 - length(s) do
        begin
          if endl = 70 then
            begin
              endl := 0;
              writeln(f);
            end;
          inc(endl);
          write(f, 0);
        end;

      for k := 1 to length(s) do
        begin
          if endl = 70 then
            begin
              endl := 0;
              writeln(f);
            end;
          inc(endl);
          write(f, s[k]);
        end;
    end;
  close(f);
end;

begin
  init;
  genbase;
  printresult;
end.

Download