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 C (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>

int p;
int b0;
int A[3000];
int primes[11];
int ps;

int root;
int iroot;
int dlog[3000];

int modpow(int x, int n){
  int r=1;
  for(;n;n>>=1){
    if(n&1) r = r * x % p;
    x = x * x % p;
  }
  return r;
}



int main(){
  int i, j, x, q;
  scanf("%d", &p);
  if(p == 2) root = 1;
  else {
    q = p-1;
    for(i=2;i*i<=q;i++){
      if(q % i == 0){
        primes[ps++] = i;
        do {q /= i;} while(q % i == 0);
      }
    }
    if(q != 1) primes[ps++] = q;
    for(i=2;i<30;i++){
      for(j=0;j<ps;j++){
        if(modpow(i, (p-1)/primes[j]) == 1) break;
      }
      if(j == ps){
        root = i;
        break;
      }
    }
  }
  x = 1;
  for(i=0;i<p-1;i++){
    dlog[x] = i;
    x = x * root % p;
  }
  iroot = modpow(root, p-2);
  scanf("%d", &b0);
  for(i=1;i<p;i++){
    int x;
    scanf("%d", &x);
    A[dlog[i]] = (x + p - b0) * modpow(i, p-2) % p;
  }

  printf("%d ", b0);
  for(i=0;i<p-1;i++){
    int r=0;
    for(j=0;j<p-1;j++){
      r = (r + modpow(iroot, i*j) * A[j]) % p;
    }
    r = r * modpow(p-1, p-2) % p;
    printf("%d ", r);
  }

  return 0;
}