program powers; procedure emit(x:integer); begin if x < 0 then write(x) else if x < 10 then write(x:1) else if x < 100 then write(x:2) else if x < 1000 then write(x:3) else if x < 10000 then write(x:4) else if x < 100000 then write(x:5) else write(x) end; var power: integer; done: boolean; i: integer; val: integer; idx: integer; pidx: integer; num_mult: integer; binary: array[1..100] of integer; begin done := false; while not done do begin (* ---- process input ---- *) read(power); if (power = -1) then begin done := true; end else if (power < 1) then begin writeln('illegal input'); end else begin (* ---- find binary representation ---- *) val := power; idx := 1; num_mult := -2; while val > 0 do begin if (odd(val)) then begin binary[idx] := 1; num_mult := num_mult + 1; end else begin binary[idx] := 0; end; idx := idx + 1; val := val div 2; num_mult := num_mult + 1; end; (* ---- emit power, number of multiplies needed ---- *) write(power:3, num_mult:3, ' '); (* ---- emit multiplies based on binary representation ---- *) pidx := 2; i := idx - 2; while i >= 1 do begin if i <> idx - 2 then write(' ; '); (* ---- square partial result ---- *) write('X'); emit(pidx); write('=X'); emit(pidx-1); write('*X'); emit(pidx-1); pidx := pidx + 1; if (binary[i] = 1) then begin (* ---- multiply partial result by X ---- *) write(' ; X'); emit(pidx); write('=X'); emit(pidx-1); write('*X1'); pidx := pidx + 1; end; i := i - 1; end; writeln(';'); end; end; end.