/** author: shobonvip created: 2025.05.16 21:46:58 **/ #include using namespace std; //* ATCODER #include using namespace atcoder; typedef modint998244353 mint; //*/ /* BOOST MULTIPRECISION #include using namespace boost::multiprecision; //*/ typedef long long ll; #define rep(i, s, n) for (int i = (int)(s); i < (int)(n); i++) #define rrep(i, s, n) for (int i = (int)(n)-1; i >= (int)(s); i--) #define all(v) v.begin(), v.end() template bool chmin(T &a, const T &b) { if (a <= b) return false; a = b; return true; } template bool chmax(T &a, const T &b) { if (a >= b) return false; a = b; return true; } template T max(vector &a){ assert(!a.empty()); T ret = a[0]; for (int i=0; i<(int)a.size(); i++) chmax(ret, a[i]); return ret; } template T min(vector &a){ assert(!a.empty()); T ret = a[0]; for (int i=0; i<(int)a.size(); i++) chmin(ret, a[i]); return ret; } template T sum(vector &a){ T ret = 0; for (int i=0; i<(int)a.size(); i++) ret += a[i]; return ret; } //defmodfact const int COMinitMAX = 2198244; mint fact[COMinitMAX+1], factinv[COMinitMAX+1]; void modfact(){ fact[0] = 1; for (int i=1; i<=COMinitMAX; i++){ fact[i] = fact[i-1] * i; } factinv[COMinitMAX] = fact[COMinitMAX].inv(); for (int i=COMinitMAX-1; i>=0; i--){ factinv[i] = factinv[i+1] * (i+1); } } mint cmb(int a, int b){ if (a std::vector poly_inv(std::vector &a, int M = -314159265){ if (M == -314159265) M = (int)a.size(); else if (M <= 0) return {}; int n = a.size(); T r = a[0].pow(T::mod()-2); int m = 1; std::vector res = {r}; while (m < M){ std::vector f = a; f.resize(std::min(n, 2*m)); std::vector h = atcoder::convolution(f, res); for (int i=0; i, vector> poly_divmod(vector f, vector g){ if (f.size() < g.size()) return pair(vector(0), f); int deg = (int)f.size() - (int)g.size() + 1; vector rf = f; reverse(rf.begin(), rf.end()); rf.resize(deg); vector rg = g; reverse(rg.begin(), rg.end()); rg.resize(deg); rg = poly_inv(rg, deg); vector q = convolution(rf, rg); q.resize(deg); reverse(q.begin(), q.end()); vector h = convolution(q, g); vector r((int)f.size()); for (int i=0; i<(int)f.size(); i++){ r[i] = f[i] - h[i]; } while((int)r.size() > 0 && r[(int)r.size() - 1] == 0) r.pop_back(); return pair(q, r); } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); modfact(); int n = 1000555; vector f(n+2); for (int i=2; i<=n+1; i+=2) { f[i] += cmb(i-2,i/2-1)*fact[i/2-1]*factinv[i/2]; } vector df(n+1); for (int i=1; i<=n+1; i++) { df[i-1] += f[i] * i; } vector g(n+2); g[0] = 1; for (int i=2; i<=n+1; i+=2) { g[i] -= cmb(i-2,i/2-1)*fact[i/2-1]*factinv[i/2]; } g = poly_inv(g); vector dg(n+1); for (int i=1; i<=n+1; i++) { dg[i-1] += g[i] * i; } vector t1,t2; for (int i=1; i<(int)dg.size(); i++) t1.push_back(dg[i]); for (int i=1; i<(int)df.size(); i++) t2.push_back(df[i]); vector h = convolution(t1, poly_inv(t2)); /*for (int i=0; i<=100; i++) { cout << i << ' ' << h[i].val() << endl; }*/ // h = sum f(x)^i * (i+1), // original ... sum f(x)^i * (n/2-i) // so, ans = - h[n] + (1+n/2) * [x^n] sum f(x)^i (which is g[n]). vector ans(n + 1); for (int i=2; i<=n; i+=2){ ans[i] = - h[i] + (1+i/2) * g[i]; } int t; cin >> t; while(t--) { int v; cin >> v; cout << ans[v].val() << '\n'; } }