#include <bits/stdc++.h>

////////////
// ModInt //
////////////

// 四則演算の最も左に存在する値がModIntでなければキャストでバグる
// 例えばx = mint * 1000;やx = ModInt(1000) * mint;はいいがx = 1000 * mint;は駄目。
int64_t mod;
class ModInt {
private:
	int64_t integer_;

public:
	ModInt(const int64_t initial_number = 0)
		: integer_(initial_number){}
	
	// 四則演算
	ModInt operator+(const ModInt& operand) const
	{
		ModInt ret{this->integer_ + operand.integer_};
		if (ret.integer_ >= mod)
			ret.integer_ -= mod;
		return ret;
	}
	ModInt operator-(const ModInt& operand) const
	{
		ModInt ret{this->integer_ - operand.integer_};
		if (ret.integer_ < 0)
			ret.integer_ += mod;
		return ret;
	}
	ModInt operator*(const ModInt& operand) const
	{
		return {this->integer_ * operand.integer_ % mod};
	}
	ModInt operator/(const ModInt& operand) const
	{
		return *this * (operand ^ (mod - 2));
	}

	// 累乗
	ModInt operator^(const int64_t operand) const
	{
		ModInt ret{1}, pow_ope{this->integer_};
		for (int64_t pow{operand}; pow > 0; pow >>= 1)
		{
			if (pow & 1) ret *= pow_ope;
			pow_ope *= pow_ope;
		}
		return ret;
	}

	// 代入
	ModInt& operator=(const ModInt& operand)
	{
		this->integer_ = operand.integer_;
		return *this;
	}
	ModInt& operator+=(const ModInt& operand)
	{
		*this = *this + operand;
		return *this;
	}
	ModInt& operator-=(const ModInt& operand)
	{
		*this = *this - operand;
		return *this;
	}
	ModInt& operator*=(const ModInt& operand)
	{
		*this = *this * operand;
		return *this;
	}
	ModInt& operator/=(const ModInt& operand)
	{
		*this = *this / operand;
		return *this;
	}
	operator int64_t() { return integer_; }
};

using Mint = ModInt;
using vi = std::vector<Mint>;
void output(std::vector<vi>& mat)
{
	for (auto& e: mat)
	{
		for (auto& f: e)
			std::cout << f << ' ';
		std::cout << std::endl;
	}
	std::cout << std::endl;
}

int main()
{
	int p;
	scanf("%d", &p);
	mod = p;
	std::vector<Mint> a(p);
	for (auto& e: a) scanf("%d", &e);
	// std::vector<vi> mat(p, vi(p));
	// for (int i{}; i < p; i++)
	// {
	// 	Mint pow(1ll);
	// 	for (int j{}; j < p; j++)
	// 	{
	// 		mat[i][j] = pow;
	// 		pow *= Mint(i);
	// 	}
	// }
	// putchar('\n');
	// output(mat);
	// for (int row{}; row < p - 1; row++)
	// {
	// 	for (int col{p - 2}; col >= row; col--)
	// 		for (int i{}; i < p; i++)
	// 			mat[i][col + 1] -= mat[i][col] * Mint(row);
	// 	output(mat);				
	// 	for (int other_row{row + 1}; other_row < p; other_row++)
	// 		for (int i{}; i < p; i++)
	// 			mat[other_row][i] -= mat[row][i];
	// 	output(mat);
	// 	for (int other_row{row + 1}; other_row < p; other_row++)
	// 		for (int i{}; i < p; i++)
	// 			mat[other_row][i] /= Mint(other_row - row);
	// 	output(mat);
	// }

	// // j行目+=i行目*c倍の行列 == i列目+=j列目*c倍の行列
	// for (int row{}; row < p - 1; row++)
	// {
	// 	for (int col{p - 2}; col >= 0; col--)
	// 		col+1列目 -= col列目*row
	// 	for (int other_row{row + 1}; other_row < p; other_row++)
	// 		other_row行目 -= row行目
	// 	// row行目とrow列目はP[row][row]を除き空
	// 	// 各行をother_row-rowで割ればrow+1行目row+1列目以降は小さいヴァルデモンドになる
	// 	for (int other_row{row + 1}; other_row < p; other_row++)
	// 		other_row行目 /= other_row-row
	// }
	for (int row{}; row < p - 1; row++)
		for (int other_row{row + 1}; other_row < p; other_row++)
		{
			a[other_row] -= a[row];
			a[other_row] /= Mint(other_row - row);
		}
	for (int col{p - 2}; col >= 0; col--)
		for (int row{col}; row < p - 1; row++)
			a[row] -= a[row + 1] * Mint(col);
	
	for (int i{}; i < p; i++)
		std::cout << a[i] << (i == p - 1? '\n': ' ');
		
	return 0;
}

Measured memory_bytes: 384