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

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define rrep(i,a,b) for(int i=(a);i>=(b);--i)
#define MP make_pair
#define PB push_back
#define PII pair<int, int>
typedef long long LL;
const LL P = 998244353;
const int N = 3e3+10;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int p,a,x[N],y[N],b[N],rev[N];

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

int main(){
	scanf("%d",&p);
	rep(i,1,p-1)rev[i] = pw(i,p-2);
	rep(i,0,p-1)x[i]=0;
	x[0] = 1;
	rep(i,0,p-1){
		memset(y,0,sizeof y);
		rep(j,0,i){
			y[j] = (y[j] - i * x[j] % p + p) % p;
			y[j+1] = (y[j+1] + x[j]) % p;
		}
		memcpy(x,y,sizeof x); 
		//rrep(j,i+1,0)cout<<x[j]<<" ";cout<<endl;
	}
	//rrep(i,p,0)cout<<x[i]<<" ";cout<<endl;
	memset(b,0,sizeof b);
	rep(i,0,p-1){
		scanf("%d",&a);
		if(a==0)continue;
		int mod = 1;
		rep(j,0,p-1)if(j!=i)mod=mod*(i-j)%p;
		mod = (mod+p)%p;
		mod = rev[mod];
		
		memset(y,0,sizeof y);
		rrep(j,p-1,0)y[j]=(x[j+1]+y[j+1]*i)%p;
		//cout<<i<<" "<<rev[mod]<<endl;
		//rrep(j,p-1,0)cout<<y[j]<<" ";cout<<endl;
		rep(j,0,p-1) b[j] = (b[j] + y[j] * mod) % p;
	}
	rep(i,0,p-1)printf("%d ",b[i]);
	return 0;
}