結果
問題 | No.1697 Deque House |
ユーザー |
![]() |
提出日時 | 2021-10-01 23:30:31 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 43 ms / 3,500 ms |
コード長 | 1,484 bytes |
コンパイル時間 | 1,158 ms |
コンパイル使用メモリ | 104,724 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-19 16:25:42 |
合計ジャッジ時間 | 2,407 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 20 |
ソースコード
#pragma GCC optimize("Ofast,unroll-loops") #include <iostream> #include <vector> using namespace std; #define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i<i##_end_;i++) #define IFOR(i, begin, end) for(int i=(end)-1,i##_begin_=(begin);i>=i##_begin_;i--) #define REP(i, n) FOR(i,0,n) #define IREP(i, n) IFOR(i,0,n) #include <atcoder/modint> using mint = atcoder::modint998244353; int main() { cin.tie(nullptr), ios::sync_with_stdio(false); int N, K; cin >> N >> K; vector<int> A(N); for (auto &x : A) cin >> x; vector<mint> pow2(K * 2 + 10, 1); FOR(i, 1, pow2.size()) pow2[i] = pow2[i - 1] * 2; vector dpn(3, vector<mint>(K + 1)); vector dpsum(3, vector<mint>(K + 1)); dpn[0][0] = pow2[K * 2].inv(); vector<mint> ap(K + 1, 1); REP(i, N) { FOR(k, 1, K + 1) ap[k] = ap[k - 1] * A[i]; REP(k, K) { dpsum[0][k + 1] += dpsum[0][k]; dpn[0][k + 1] += dpn[0][k]; } IREP(k, K) { dpsum[2][k] += dpsum[2][k + 1]; dpn[2][k] += dpn[2][k + 1]; } REP(d, 3) REP(k, K + 1) { dpsum[d][k] = (dpsum[d][k] + dpn[d][k] * ap[k]) * pow2[k]; dpn[d][k] *= pow2[k]; } IREP(d, 2) { dpsum[d + 1][K] += dpsum[d][K]; dpn[d + 1][K] += dpn[d][K]; dpsum[d][K] = dpn[d][K] = 0; } } cout << accumulate(dpsum.back().begin(), dpsum.back().end(), mint(0)).val() << '\n'; }