結果
| 問題 |
No.1697 Deque House
|
| コンテスト | |
| ユーザー |
hitonanode
|
| 提出日時 | 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';
}
hitonanode