結果
問題 |
No.3117 Reversible Tile
|
ユーザー |
|
提出日時 | 2025-04-24 15:00:58 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 24 ms / 3,000 ms |
コード長 | 1,617 bytes |
コンパイル時間 | 2,160 ms |
コンパイル使用メモリ | 198,100 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-04-24 15:01:02 |
合計ジャッジ時間 | 3,775 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 24 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; const ll MOD = 998244353; // a^e mod ll modpow(ll a, ll e){ ll r = 1; a %= MOD; while(e){ if(e & 1) r = r * a % MOD; a = a * a % MOD; e >>= 1; } return r; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; vector<int>A(N+2, 0); for(int i = 1; i <= N; i++){ cin >> A[i]; } // b_j の計算 vector<int> b(N+1); for(int i = 1; i < N; i++){ b[i] = (A[i] ^ A[i+1]); } b[N] = A[N]; // x_j = (-1)^{b_j} を MOD 表現 (1 または MOD-1) vector<ll> x(N+1); for(int i = 1; i <= N; i++){ x[i] = (b[i] ? MOD-1 : 1); } // 基本対称多項式 e[0..N] vector<ll> e(N+1, 0); e[0] = 1; for(int i = 1; i <= N; i++){ // 後ろから回さないと上書きが壊れる for(int j = i; j >= 1; j--){ e[j] = (e[j] + x[i] * e[j-1]) % MOD; } } // 定数 ll inv2 = (MOD + 1) / 2; ll inv2N = modpow(inv2, N); // 2^{-N} ll ans = 0; ll T = N + 1; // ℓ = 0..N for(int ell = 0; ell <= N; ell++){ // d = N - 2ℓ + 1 ll d = (ll)N - 2LL*ell + 1; // f_ell = (d^2 - T)/2 mod ll f = ( (d%MOD*d%MOD - T) % MOD + MOD ) % MOD; f = f * inv2 % MOD; // f^M ll pw = modpow(f, M); // e[ell] * f^M を足す ans = (ans + e[ell] * pw) % MOD; } // 最後に 2^{-N} を掛ける ans = ans * inv2N % MOD; cout << ans << "\n"; return 0; }