#line 1 "a.cpp" #include using namespace std; using ll=long long; const ll ILL=2167167167167167167; const int INF=2100000000; #define rep(i,a,b) for (int i=(int)(a);i<(int)(b);i++) #define all(p) p.begin(),p.end() template using pq_ = priority_queue, greater>; template int LB(vector &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();} template int UB(vector &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();} template bool chmin(T &a,T b){if(b bool chmax(T &a,T b){if(a void So(vector &v) {sort(v.begin(),v.end());} template void Sore(vector &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});} bool yneos(bool a,bool upp=false){if(a){cout<<(upp?"YES\n":"Yes\n");}else{cout<<(upp?"NO\n":"No\n");}return a;} template void vec_out(vector &p,int ty=0){ if(ty==2){cout<<'{';for(int i=0;i<(int)p.size();i++){if(i){cout<<",";}cout<<'"'< T vec_min(vector &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmin(ans,x);return ans;} template T vec_max(vector &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmax(ans,x);return ans;} template T vec_sum(vector &a){T ans=T(0);for(auto &x:a) ans+=x;return ans;} int pop_count(long long a){int res=0;while(a){res+=(int)(a&1),a>>=1;}return res;} template T square(T a){return a * a;} #line 2 "/Users/Shared/po167_library/fps/FPS_composition.hpp" #include namespace po167{ // n = |g| // return f(g(x)) // https://maspypy.com/fps-合成・逆関数の解説(2)転置原理による合成ア template std::vector FPS_comp(std::vector f, std::vector g){ assert(g[0] == 0); auto rec = [&](auto rec, int n, int k, std::vector Q) -> std::vector { if (n == 1){ std::vector p(2 * k); std::reverse(f.begin(), f.end()); for (int i = 0; i < k; i++) p[2 * i] = f[i]; return p; } std::vector nxt_Q(2 * n * k); for (int i = 0; i < n * k; i++) nxt_Q[n * k + i] += Q[i * 2] * 2; Q.resize(4 * n * k); atcoder::internal::butterfly(Q); // Q(-x) std::vector R(4 * n * k); for (int i = 0; i < 2 * n * k; i++){ R[i * 2] = Q[i * 2 + 1]; R[i * 2 + 1] = Q[i * 2]; } T iz = (T)(1) / (T)(4 * n * k); for (int i = 0; i < 4 * n * k; i++) Q[i] *= R[i]; for (int i = 0; i < 2 * n * k; i++) Q[i] = Q[i * 2]; Q.resize(2 * n * k); atcoder::internal::butterfly_inv(Q); for (int i = 0; i < 2 * n * k; i++) nxt_Q[i] += Q[i] * iz * 2; for (int j = 0; j < 2 * k; j++) for (int i = n / 2; i < n; i++){ nxt_Q[n * j + i] = 0; } std::vector pq = rec(rec, n / 2, k * 2, nxt_Q); std::vector p(2 * n * k); for (int j = 0; j < 2 * k; j++) for (int i = n / 2; i < n; i++){ pq[n * j + i] = 0; } for (int i = 0; i < n * k; i++) p[i * 2 + 1] += pq[n * k + i]; std::reverse(pq.begin(), pq.end()); atcoder::internal::butterfly(pq); pq.resize(4 * n * k); for (int i = 2 * n * k - 1; i >= 0; i--){ pq[i * 2 + 1] = pq[i]; pq[i * 2] = pq[i]; } for (int i = 0; i < 4 * n * k; i++) pq[i] *= R[i]; atcoder::internal::butterfly_inv(pq); for (int i = 0; i < 2 * n * k; i++) p[i] += pq[4 * n * k - 1 - i] * iz; return p; }; int N = (int)g.size(); int n = 1; while (n < N) n *= 2; f.resize(n, 0); g.resize(n, 0); std::vector Q(2 * n); for (int i = 0; i < n; i++) Q[i] = -g[i]; auto p = rec(rec, n, 1, Q); std::vector res(n); for (int i = 0; i < n; i++) res[i] = p[i]; std::reverse(res.begin(), res.end()); res.resize(N); return res; } } #line 26 "a.cpp" using mint = atcoder::modint998244353; void solve(); // DEAR MYSTERIES / TOMOO int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; // cin >> t; rep(i, 0, t) solve(); } void solve(){ int N, M; cin >> N >> M; vector p(N); rep(i, 0, N) { int a; cin >> a; p[i] = a; } vector ans(N); ans[1] = 1; while (M) { if (M & 1) { ans = po167::FPS_comp(ans, p); } M /= 2; p = po167::FPS_comp(p, p); } rep(i, 0, N) { cout << ans[i].val() << (i + 1 == N ? "\n" : " "); } }