func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 998244353, N = 200200, G = 3, Gi = 332748118;   long long power(long long base, long long b) {     long long ret = 1;     while (b) {       if (b & 1) ret = ret * base % mod;       base = base * base % mod;       b >>= 1;     }     return ret;   }   int limit, len, last = -1, pos[N];   long long G0[N], G1[N], G2[N], g[N], F0[N], F1[N], F2[N];   long long w[N];   void getlen(int n) {     limit = 1, len = 0;     while (limit < n) limit <<= 1, ++len;     w[0] = 1;     long long gg = power(G, (mod - 1) / limit);     for (int i = 1; i < limit; ++i) {       pos[i] = (pos[i >> 1] >> 1) | ((i & 1) << (len - 1));       w[i] = w[i - 1] * gg % mod;     }   }   void ntt(long long *a, int n, int type) {     for (int i = 0; i < limit; ++i)       if (i < pos[i]) swap(a[i], a[pos[i]]);     for (int mid = 1; mid < limit; mid <<= 1)       for (int j = 0, r = mid << 1; j < limit; j += r)         for (int k = 0; k < mid; ++k) {           long long x = a[j + k], y = w[limit / r * k] * a[j + mid + k] % mod;           a[j + k] = (x + y) % mod;           a[j + mid + k] = (x - y + mod) % mod;         }     if (type == -1) {       reverse(a + 1, a + limit);       long long inv = power(limit, mod - 2);       for (int i = 0; i < limit; ++i) a[i] = inv * a[i] % mod;     }   }   long long f[N], h[N], tmp[N];   void calc(long long *a, int n, long long *b, int m, long long *c, int nm = -1) {     if (nm == -1) nm = n + m - 1;     getlen(nm);     for (int i = 0; i < n; ++i) f[i] = a[i];     for (int i = n; i < limit; ++i) f[i] = 0;     for (int i = 0; i < m; ++i) h[i] = b[i];     for (int i = m; i < limit; ++i) h[i] = 0;     ntt(f, nm, 1), ntt(h, nm, 1);     for (int i = 0; i < limit; ++i) f[i] = f[i] * h[i] % mod;     ntt(f, nm, -1);     for (int i = 0; i < nm; ++i) c[i] = f[i];   }   void CDQ(int l, int r) {     if (l == r) {       F0[l] = (F0[l] + G0[l]) % mod;       F1[l] = (F1[l] + G1[l]) % mod;       F2[l] = (F2[l] + G2[l]) % mod;       return;     }     int mid = (l + r) >> 1;     CDQ(l, mid);     calc(F0 + l, mid - l + 1, G0, r - l + 1, tmp + l, r - l + 1);     for (int i = mid + 1; i <= r; ++i) F0[i] = (F0[i] + tmp[i]) % mod;     calc(F0 + l, mid - l + 1, G1, r - l + 1, tmp + l, r - l + 1);     for (int i = mid + 1; i <= r; ++i) F1[i] = (F1[i] + tmp[i]) % mod;     calc(F1 + l, mid - l + 1, G1, r - l + 1, tmp + l, r - l + 1);     for (int i = mid + 1; i <= r; ++i) F0[i] = (F0[i] + tmp[i]) % mod;     for (int i = mid + 1; i <= r; ++i) F2[i] = (F2[i] + tmp[i]) % mod;     calc(F1 + l, mid - l + 1, G2, r - l + 1, tmp + l, r - l + 1);     for (int i = mid + 1; i <= r; ++i) F1[i] = (F1[i] + tmp[i]) % mod;     calc(F2 + l, mid - l + 1, G2, r - l + 1, tmp + l, r - l + 1);     for (int i = mid + 1; i <= r; ++i) F2[i] = (F2[i] + tmp[i]) % mod;     CDQ(mid + 1, r);   }   int n;   int main() {     scanf( %d , &n);     g[0] = g[2] = 1;     for (int i = 4; i <= n; ++i) g[i] = (g[i - 2] + g[i - 4]) % mod;     for (int i = 1; i <= n; ++i)       G0[i] = 1LL * (i - 1) * (i - 1) % mod * g[i - 1] % mod;     for (int i = 2; i <= n; ++i)       G1[i] = 1LL * (i - 1) * (i - 1) % mod * g[i - 2] % mod;     for (int i = 3; i <= n; ++i)       G2[i] = 1LL * (i - 1) * (i - 1) % mod * g[i - 3] % mod;     CDQ(1, n);     long long Ans = 1LL * n * (G0[n] + G2[n]) % mod;     for (int i = 2; i <= n - 2; ++i) {       Ans = (Ans + (G0[i] * F0[n - i] % mod + 2LL * G1[i] * F1[n - i] % mod +                     G2[i] * F2[n - i] % mod) *                        (long long)i % mod) %             mod;     }     printf( %lld n , (Ans % mod + mod) % mod);     return 0;   }   