program Meelo;
type
integers = array of integer;
function TwoMerge(rij1,rij2 : integers) : integers;
{
Two-way merge.
Described on page 160 of "The Art of Computer Programming"
volume 3 / "Sorting and Searching" by Donald E. Knuth.
}
var
LIM1,LIM2,LIM3 : integer;
max1,max2,sentinel : integer;
k, k1, k2, L : integer;
rij3 : integers;
begin
LIM1 := Length(rij1);
LIM2 := Length(rij2);
LIM3 := LIM1 + LIM2;
SetLength(rij3,LIM3);
if (LIM2 = 0) and (LIM1 > 0 )then
for k := 0 to LIM1-1 do
rij3[k] := rij1[k];
if (LIM1 = 0) and (LIM2 > 0 )then
for k := 0 to LIM2-1 do
rij3[k] := rij2[k];
if (LIM1 > 0) and (LIM2 > 0) then
begin
max1 := rij1[LIM1-1];
max2 := rij2[LIM2-1];
sentinel := max1;
if max2 > max1 then sentinel := max2;
sentinel := sentinel + 1;
k1 := 0;
k2 := 0;
for L := 0 to LIM3-1 do
begin
if rij1[k1] <= rij2[k2] then
begin
rij3[L] := rij1[k1];
rij1[k1] := sentinel;
if k1 < LIM1-1 then k1 := k1+1;
end else begin
rij3[L] := rij2[k2];
rij2[k2] := sentinel;
if k2 < LIM2-1 then k2 := k2+1;
end;
end;
end;
TwoMerge := rij3;
end;
function plus(a,b : integers) : integers;
{
Summation with sorted arrays
}
var
q,r,rij,som : integers;
L,k,P : integer;
begin
L := Length(a);
SetLength(q,L);
for k := 0 to L-1 do
q[k] := a[k];
L := Length(b);
SetLength(r,L);
for k := 0 to L-1 do
r[k] := b[k];
rij := TwoMerge(q,r);
L := Length(rij);
if L = 0 then
begin
plus := rij;
Exit;
end;
SetLength(som,L);
P := 1;
som[0] := rij[0];
for k := 1 to L-1 do
begin
if rij[k] > som[P-1] then
begin
som[P] := rij[k]; P := P+1; Continue;
end;
if rij[k] = som[P-1] then
begin
som[P-1] := rij[k]+1; Continue;
end;
if rij[k] < som[P-1] then
begin
som[P] := som[P-1]; som[P-1] := rij[k]; P := P+1; Continue;
end;
end;
SetLength(som,P);
plus := som;
end;
function maal(a,b : integers) : integers;
{
Multiplication with sorted arrays
}
var
M,N,i,j,links : integer;
h,produkt : integers;
begin
M := Length(a);
N := Length(b);
SetLength(h,N);
SetLength(produkt,0);
for i := 0 to M-1 do
begin
links := a[i];
for j := 0 to N-1 do
h[j] := b[j] + links;
produkt := plus(produkt,h);
end;
maal := produkt;
end;
function dubbel(getal : string; carry : boolean) : string;
{
Make decimal number representation twice as large
}
var
G,H : string;
rest : boolean;
c : byte;
k,L : integer;
begin
G := getal;
L := Length(G);
rest := carry;
for k := L downto 1 do
begin
c := byte(G[k])-48;
c := c*2;
if rest then c := c+1;
rest := (c > 9);
if rest then c := c-10;
G[k] := char(c+48);
end;
H := G;
if rest then H := '1' + G;
dubbel := H;
end;
function decimaal(rij : integers) : string;
{
Convert sorted array to decimal string
}
var
G : string;
L,p,k : integer;
rest : boolean;
begin
decimaal := '0';
L := Length(rij);
if L = 0 then Exit;
G := '0';
p := L-1;
k := rij[p];
while (p >= 0) do
begin
rest := false;
if rij[p] = k then
begin
rest := true;
p := p-1;
end;
G := dubbel(G,rest);
k := k-1;
end;
while k >= 0 do
begin
G := dubbel(G,false);
k := k-1;
end;
decimaal := G;
end;
function let(n : integer) : integers;
{
Convert integer to sorted array
}
var
k,m,L : integer;
uit : integers;
begin
m := n;
SetLength(uit,32);
for k := 0 to 31 do
uit[k] := 0;
L := 0;
for k := 0 to 31 do
begin
if (m and 1) = 1 then
begin
uit[L] := k;
L := L + 1;
end;
m := m shr 1;
end;
SetLength(uit,L);
let := uit;
end;
function macht(x,n : integer) : string;
{
Power x^n
}
var
m : integer;
p, y : integers;
begin
m := n;
SetLength(p,1);
p[0] := 0;
SetLength(y,0);
y := let(x);
while m > 0 do begin
if (m and 1) > 0 then p := maal(p,y);
m := m shr 1;
y := maal(y,y);
end;
macht := decimaal(p);
end;
procedure doen;
var
ff : TextFile;
begin
AssignFile(ff,'drie5.txt');
Rewrite(ff);
Writeln(ff,macht(3,100000));
CloseFile(ff);
end;
procedure lezen;
var
ff : TextFile;
alles : string;
begin
AssignFile(ff,'drie5.txt');
Reset(ff);
Readln(ff,alles);
CloseFile(ff);
Writeln(Length(alles));
Writeln(alles[1],' ',alles[23857],' ',alles[47713]);
end;
begin
doen;
lezen;
end.