#include using namespace std; //#pragma GCC optimize("Ofast") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #define ms(s, n) memset(s, n, sizeof(s)) #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define FORd(i, a, b) for (int i = (a) - 1; i >= (b); --i) #define FORall(it, a) for (__typeof((a).begin()) it = (a).begin(); it != (a).end(); it++) #define sz(a) int((a).size()) #define pconent(t, x) (t.find(x) != t.end()) #define all(a) (a).begin(), (a).end() #define uni(a) (a).erase(unique(all(a)), (a).end()) #define pb push_back #define pf push_front #define mp make_pair #define fi first #define se second #define prec(n) fixed<> (i)) & 1) #define bitcount(n) __builtin_popcountll(n) typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair pi; typedef vector vi; typedef vector vii; const int MOD = (int) 1e9 + 7; const int FFTMOD = 1007681537; const int INF = (int) 1e9; const ll LINF = (ll) 1e18; const ld PI = acos((ld) -1); const ld EPS = 1e-9; inline ll gcd(ll a, ll b) {ll r; while (b) {r = a % b; a = b; b = r;} return a;} inline ll lcm(ll a, ll b) {return a / gcd(a, b) * b;} inline ll fpow(ll n, ll k, int p = MOD) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n % p; n = n * n % p;} return r;} template inline int chkmin(T& a, const T& val) {return val < a ? a = val, 1 : 0;} template inline int chkmax(T& a, const T& val) {return a < val ? a = val, 1 : 0;} inline ll isqrt(ll k) {ll r = sqrt(k) + 1; while (r * r > k) r--; return r;} inline ll icbrt(ll k) {ll r = cbrt(k) + 1; while (r * r * r > k) r--; return r;} inline void addmod(int& a, int val, int p = MOD) {if ((a = (a + val)) >= p) a -= p;} inline void submod(int& a, int val, int p = MOD) {if ((a = (a - val)) < 0) a += p;} inline int mult(int a, int b, int p = MOD) {return (ll) a * b % p;} inline int inv(int a, int p = MOD) {return fpow(a, p - 2, p);} inline int sign(ld x) {return x < -EPS ? -1 : x > +EPS;} inline int sign(ld x, ld y) {return sign(x - y);} #define db(x) cerr << #x << " = " << (x) << " "; #define endln cerr << "\n"; #define double long double const int MAXF = 1 << 17; struct cp { double x, y; cp(double x = 0, double y = 0) : x(x), y(y) {} cp operator + (const cp& rhs) const { return cp(x + rhs.x, y + rhs.y); } cp operator - (const cp& rhs) const { return cp(x - rhs.x, y - rhs.y); } cp operator * (const cp& rhs) const { return cp(x * rhs.x - y * rhs.y, x * rhs.y + y * rhs.x); } cp operator !() const { return cp(x, -y); } } rts[MAXF + 1]; cp fa[MAXF], fb[MAXF]; cp fc[MAXF], fd[MAXF]; int bitrev[MAXF]; void fftinit() { int k = 0; while ((1 << k) < MAXF) k++; bitrev[0] = 0; for (int i = 1; i < MAXF; i++) { bitrev[i] = bitrev[i >> 1] >> 1 | ((i & 1) << k - 1); } double PI = acos((double) -1.0); cp w = cp(cos(2 * PI / MAXF), sin(2 * PI / MAXF)); rts[0] = rts[MAXF] = cp(1, 0); for (int i = 1; i + i <= MAXF; i++) { rts[i] = rts[i - 1] * w; } for (int i = MAXF / 2 + 1; i < MAXF; i++) { rts[i] = !rts[MAXF - i]; } } void dft(cp a[], int n, int sign) { int d = 0; while ((1 << d) * n != MAXF) d++; for (int i = 0; i < n; i++) { if (i < (bitrev[i] >> d)) { swap(a[i], a[bitrev[i] >> d]); } } for (int len = 2; len <= n; len <<= 1) { int delta = MAXF / len * sign; for (int i = 0; i < n; i += len) { cp *x = a + i,*y = a + i + (len >> 1), *w = sign > 0 ? rts : rts + MAXF; for (int k = 0; k + k < len; k++) { cp z = *y * *w; *y = *x - z, *x = *x + z; x++, y++, w += delta; } } } if (sign < 0) { for (int i = 0; i < n; i++) { a[i].x /= n; a[i].y /= n; } } } void multiply(int a[], int b[], int na, int nb, long long c[]) { int n = na + nb - 1; while (n != (n & -n)) n += n & -n; for (int i = 0; i < n; i++) fa[i] = fb[i] = cp(); for (int i = 0; i < na; i++) fa[i] = cp(a[i]); for (int i = 0; i < nb; i++) fb[i] = cp(b[i]); dft(fa, n, 1), dft(fb, n, 1); for (int i = 0; i < n; i++) fa[i] = fa[i] * fb[i]; dft(fa, n, -1); for (int i = 0; i < n; i++) c[i] = (long long) floor(fa[i].x + 0.5); } void multiply(int a[], int b[], int na, int nb, int c[], int mod = (int) 1e9 + 7, int dup = 0) { int n = na + nb - 1; while (n != (n & -n)) n += n & -n; for (int i = 0; i < n; i++) fa[i] = fb[i] = cp(); static const int magic = 15; for (int i = 0; i < na; i++) fa[i] = cp(a[i] >> magic, a[i] & (1 << magic) - 1); for (int i = 0; i < nb; i++) fb[i] = cp(b[i] >> magic, b[i] & (1 << magic) - 1); dft(fa, n, 1); if (!dup) { dft(fb, n, 1); } else { for (int i = 0; i < n; i++) fb[i] = fa[i]; } for (int i = 0; i < n; i++) { int j = (n - i) % n; cp x = fa[i] + !fa[j]; cp y = fb[i] + !fb[j]; cp z = !fa[j] - fa[i]; cp t = !fb[j] - fb[i]; fc[i] = (x * t + y * z) * cp(0, 0.25); fd[i] = x * y * cp(0, 0.25) + z * t * cp(-0.25, 0); } dft(fc, n, -1), dft(fd, n, -1); for (int i = 0; i < n; i++) { long long u = ((long long) floor(fc[i].x + 0.5)) % mod; long long v = ((long long) floor(fd[i].x + 0.5)) % mod; long long w = ((long long) floor(fd[i].y + 0.5)) % mod; c[i] = ((u << 15) + v + (w << 30)) % mod; } } vector multiply(vector a, vector b, int mod = (int) 1e9 + 7) { static int fa[MAXF], fb[MAXF], fc[MAXF]; int na = a.size(), nb = b.size(); for (int i = 0; i < na; i++) fa[i] = a[i]; for (int i = 0; i < nb; i++) fb[i] = b[i]; multiply(fa, fb, na, nb, fc, mod, a == b); int k = na + nb - 1; vector res(k); for (int i = 0; i < k; i++) res[i] = fc[i]; return res; } vector invert(vector a, int n, int mod) { if (n == 1) { vector res(1); res[0] = fpow(a[0], mod - 2, mod); return res; } int nn = n + 1 >> 1; vector b = invert(a, nn, mod); vector c = multiply(b, b, mod); c = multiply(a, c, mod); while (b.size() < n) b.push_back(0); while (b.size() > n) b.pop_back(); for (int i = 0; i < n; i++) { b[i] = b[i] + b[i] - c[i]; if (b[i] >= mod) b[i] -= mod; if (b[i] < 0) b[i] += mod; } return b; } const int maxn = 1 << 17; int fac[maxn]; int ifac[maxn]; int n, k; long long t; int a[maxn]; int e[maxn]; int p[maxn]; int c[maxn]; vi poly(long long a, int k) { vi res(k); FOR(i, 0, k) res[i] = mult(fpow(a % MOD, i), ifac[i]); return res; } vi divide(int L, int R) { if (L == R) { vi res(2); res[0] = a[L]; res[1] = 1; return res; } if (L == R - 1) { vi res(3); res[0] = mult(a[L], a[R]); res[1] = (a[L] + a[R]) % MOD; res[2] = 1; return res; } vi v1 = divide(L, L + R >> 1); vi v2 = divide((L + R >> 1) + 1, R); return multiply(v1, v2); } void chemthan() { fac[0] = 1; FOR(i, 1, maxn) fac[i] = mult(fac[i - 1], i); FOR(i, 0, maxn) ifac[i] = inv(fac[i]); fftinit(); cin >> n >> k >> t; assert(1 <= n && n <= 1e5); assert(1 <= k && k <= 5e4); assert(1 <= t && t <= 1e18); FOR(i, 0, n) { cin >> a[i]; assert(0 <= a[i] && a[i] < 1e9 + 7); } vi vals = divide(0, n - 1); FOR(i, 0, n) { e[i] = vals[n - i - 1]; if (!(i & 1)) { e[i] = (MOD - e[i]) % MOD; } } for (int i = 1; i <= k; i++) { addmod(p[i], mult(i, e[i - 1])); p[i] = (MOD - p[i]) % MOD; for (int k = 1; (i + 1) % k == 0; k <<= 1) { multiply(p + i - k + 1, e + k - 1, k, k, c, MOD); for (int j = i + 1; j < i + 2 * k; j++) { p[j] = (p[j] + c[j - i - 1]) % MOD; } } } p[0] = n; vi v1 = poly(t + 1, k + 2); v1.erase(v1.begin()); vi v2 = poly(1, k + 2); v2.erase(v2.begin()); vi v3 = multiply(v1, invert(v2, k + 1, MOD)); while (sz(v3) > k + 1) v3.pop_back(); vi v4(k + 1); FOR(i, 0, k + 1) v4[i] = mult(p[i], ifac[i]); vi res = multiply(v3, v4); FOR(i, 0, k + 1) { cout << mult(res[i], fac[i]) << " \n"[i == k]; } } int main(int argc, char* argv[]) { ios_base::sync_with_stdio(0), cin.tie(0); if (argc > 1) { assert(freopen(argv[1], "r", stdin)); } if (argc > 2) { assert(freopen(argv[2], "wb", stdout)); } chemthan(); cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n"; return 0; }