結果
問題 | No.1697 Deque House |
ユーザー | hitonanode |
提出日時 | 2021-10-01 23:30:31 |
言語 | C++23 (gcc 12.3.0 + boost 1.83.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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 1 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 1 ms
5,376 KB |
testcase_07 | AC | 1 ms
5,376 KB |
testcase_08 | AC | 1 ms
5,376 KB |
testcase_09 | AC | 43 ms
5,376 KB |
testcase_10 | AC | 16 ms
5,376 KB |
testcase_11 | AC | 18 ms
5,376 KB |
testcase_12 | AC | 14 ms
5,376 KB |
testcase_13 | AC | 8 ms
5,376 KB |
testcase_14 | AC | 13 ms
5,376 KB |
testcase_15 | AC | 24 ms
5,376 KB |
testcase_16 | AC | 21 ms
5,376 KB |
testcase_17 | AC | 13 ms
5,376 KB |
testcase_18 | AC | 13 ms
5,376 KB |
testcase_19 | AC | 14 ms
5,376 KB |
testcase_20 | AC | 40 ms
5,376 KB |
testcase_21 | AC | 42 ms
5,376 KB |
testcase_22 | AC | 43 ms
5,376 KB |
ソースコード
#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'; }