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.