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.