Problem:
Score : 600 points

Problem Statement

Given are a prime number p and a sequence of p integers a_0, \ldots, a_{p-1} consisting of zeros and ones.

Find a polynomial of degree at most p-1, f(x) = b_{p-1} x^{p-1} + b_{p-2} x^{p-2} + \ldots + b_0, satisfying the following conditions:

For each i (0 \leq i \leq p-1), b_i is an integer such that 0 \leq b_i \leq p-1.

For each i (0 \leq i \leq p-1), f(i) \equiv a_i \pmod p.

Constraints

2 \leq p \leq 2999

p is a prime number.

0 \leq a_i \leq 1

Input

Input is given from Standard Input in the following format:

p
a_0 a_1 \ldots a_{p-1}

Output

Print b_0, b_1, \ldots, b_{p-1} of a polynomial f(x) satisfying the conditions, in this order, with spaces in between.

It can be proved that a solution always exists. If multiple solutions exist, any of them will be accepted.

Sample Input 1

2
1 0

Sample Output 1

1 1

f(x) = x + 1 satisfies the conditions, as follows:

f(0) = 0 + 1 = 1 \equiv 1 \pmod 2

f(1) = 1 + 1 = 2 \equiv 0 \pmod 2

Sample Input 2

3
0 0 0

Sample Output 2

0 0 0

f(x) = 0 is also valid.

Sample Input 3

5
0 1 0 1 0

Sample Output 3

0 2 0 1 3

Solution in LuaJIT (2.0.4) (judge verdict: Time Limit Exceeded)

local mfl, mce = math.floor, math.ceil
local p = io.read("*n")
local function badd(x, y) return (x + y) % p end
local function bmul(x, y) return (x * y) % p end

local a = {}
for i = 1, p do
  a[i] = io.read("*n")
end
local poldst = {}
for i = 1, p do
  poldst[i] = 0
end

local fact = {1}
local invs = {1}
local invfact = {1}
for i = 2, p - 1 do
  fact[i] = bmul(fact[i - 1], i)
  invs[i] = bmul(mfl(p / i), p - invs[p % i])
  invfact[i] = bmul(invfact[i - 1], invs[i])
end

for i = 0, p - 1 do
  local v = a[i + 1]
  if 0 < i then
    v = bmul(v, invfact[i])
  end
  if i < p - 1 then
    v = bmul(v, invfact[p - 1 - i])
    if (p - 1 - i) % 2 == 1 then
      v = (p - v) % p
    end
  end
  local pol = {}
  pol[1] = 1
  for j = 2, p do pol[j] = 0 end
  for j = 0, p - 1 do
    if i ~= j then
      for k = p, 1, -1 do
        if 1 < k then
          pol[k] = badd(pol[k - 1], bmul(pol[k], p - j))
        else
          pol[1] = bmul(pol[1], p - j)
        end
      end
    end
  end
  for j = 1, p do
    poldst[j] = badd(poldst[j], bmul(v, pol[j]))
  end
end
print(table.concat(poldst, " "))