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: Wrong Answer)

#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
#define ll long long
#define eps 1e-7
#define all(x) ((x).begin()),((x).end())
#define usecppio ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
using pii = pair<int, int>;

#define int ll
int p, a[3030];
int poly[5050];
ll modpow(ll x, ll y)
{
	ll res = 1;
	x = x % p;
	while (y > 0)
	{
		if (y & 1)
			res = (res*x) % p;
		y = y>>1;
		x = (x*x) % p;
	}
	return res;
}

ll modinv (ll x)
{
	return modpow(x,p-2);
}

inline int modulo(int x)
{
	return (((x/p+1)*p+x)%p);
}

void polymult(int t) // (x-t) multiply
{
	int newpoly[5050];
	int newpoly2[5050];
	for (int i = 0; i<5050; i++)
		newpoly[i] = modulo(poly[i] * (-t+p));
	for (int i = 1; i<5050; i++)
		newpoly2[i] = poly[i-1];
	for (int i = 0; i<5050; i++)
		poly[i] = modulo(newpoly[i] + newpoly2[i]);
}

void printpoly()
{
	for (int i = 0; i<p; i++)
		cout << poly[i] << ' ';
	cout << '\n';
}
int32_t main()
{
	usecppio
	cin >> p;
	for (int i = 0; i<p; i++)
		cin >> a[i];
	poly[0] = a[0];
	for (int i = 1; i<p; i++)
	{
		polymult(i);
		//printf("%d tozero check\n",i);
		//printpoly();
		if (a[i])
		{
			ll b = modpow(i,i);
			ll u = modinv(b);
			poly[i] = modulo(poly[i] + u);
		}
		//printf("%d torealvalue check\n",i);
		//printpoly();
	}
	for (int i = 0; i<p; i++)
		poly[i] = modulo(poly[i]);
	printpoly();
}