{$Q-,R-,I-} program macro; const MaxS=18; MaxN=1 shl MaxS; type float = extended; complex = record x, y : float end; arr = array [0..MaxN-1] of complex; parr = ^arr; var Si : array [0..MaxN*3 shr 2] of float; rev : array [0..MaxN-1] of integer; A, B, C : parr; s, N, Q, H : integer; procedure mktab; var i : integer; a, b : extended; begin rev[0] := 0; Q := 1; while Q < N do begin for i := 0 to Q - 1 do begin rev[i] := rev[i] shl 1; rev[i+Q] := rev[i] + 1 end; Q := Q shl 1 end; a := 2*Pi/N; Q := N shr 2; H := N shr 1; for i := 0 to N shr 3 do begin b := a * i; Si[Q-i] := cos (b); Si[i] := sin(b); end; for i := 1 to Q do Si[Q+i] := Si[Q-i]; for i := 0 to Q do Si[H+i] := -Si[i]; end; procedure step (k : integer; const A : arr; var B : arr); var m, c, d, i : integer; t, u, v, r : complex; begin m := N shr k; r.x := 1; r.y := 0; c := m; d := 0; for i := 0 to H - 1 do begin t := A[2*i]; u := A[2*i+1]; v.x := u.x * r.x - u.y * r.y; v.y := u.x * r.y + u.y * r.x; B[i].x := t.x + v.x; B[i].y := t.y + v.y; B[i+H].x := t.x - v.x; B[i+H].y := t.y - v.y; dec (c); if c = 0 then begin c := m; inc (d, m); r.y := Si[d]; r.x := Si[d+Q]; end end end; var i, t0 : integer; begin assign (input, 'fourier.in'); reset (input); assign (output, 'fourier.out'); rewrite (output); read (s, t0); assert ((0 <= t0) and (t0 <= s) and (s <= MaxS)); N := 1 shl s; mktab; new (A); new (B); for i := 0 to N - 1 do with A^[rev[i]] do read (x, y); for i := 1 to t0 do begin step (i, A^, B^); C := A; A := B; B := C end; for i := 0 to N - 1 do with A^[i] do writeln (x:8:8, ' ', y:8:8); end.