結果
問題 |
No.3247 Multiplication 8 2
|
ユーザー |
![]() |
提出日時 | 2025-07-06 13:38:28 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,864 bytes |
コンパイル時間 | 2,197 ms |
コンパイル使用メモリ | 120,392 KB |
実行使用メモリ | 45,884 KB |
最終ジャッジ日時 | 2025-07-09 13:35:16 |
合計ジャッジ時間 | 24,850 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 4 |
other | AC * 2 WA * 26 |
ソースコード
#include <atcoder/convolution> #include <iostream> #include <vector> using namespace std; using namespace atcoder; using ll = long long; const ll MOD = 998244353; ll my_pow(ll x, ll n, ll mod) { ll ret; if (n == 0) { ret = 1; } else if (n % 2 == 1) { ret = (x * my_pow((x * x) % mod, n / 2, mod)) % mod; } else { ret = my_pow((x * x) % mod, n / 2, mod); } return ret; } int main() { ll N, K; cin >> N >> K; vector<ll> A(N); for (ll i = 0; i < N; i++) { cin >> A[i]; } // どこで分かれるかを考える vector<ll> start_pos(1, 0); ll now = 1; for (ll i = 0; i < N; i++) { now *= A[i]; if (now == 8) { start_pos.push_back(i); now = 1; } else if (abs(now) > 8) { cout << 0 << endl; return 0; } } if (now != 1) { cout << 0 << endl; return 0; } // 最初と最後の要素については候補に含まれない // それ以外だけは自由度がある ll len = start_pos.size(); vector<vector<ll>> idxs(len, vector<ll>(0)); ll now_id = 0; idxs[0].push_back(0); for (ll i = 0; i < N; i++) { now *= A[i]; if (now == 8) { now_id++; now = 1; } if (now == 1 && now_id != len - 1) { idxs[now_id].push_back(i + 1); } } idxs[len - 1].push_back(N); for (ll i = 0; i < len; i++) { for (ll j = 0; j < idxs[i].size(); j++) { cout << idxs[i][j] << " "; } cout << endl; } vector<ll> pows_k(N + 1); for (ll i = 0; i <= N; i++) { pows_k[i] = my_pow(i, K, MOD); } ll ans = 0; vector<ll> prod_l(len + 2, 1); vector<ll> prod_r(len + 2, 1); for (ll i = 0; i < len; i++) { prod_l[i + 1] = prod_l[i] * (ll)idxs[i].size(); } for (ll i = len - 1; i >= 0; i--) { prod_r[i + 1] = prod_r[i + 2] * (ll)idxs[i].size(); } // 隣接項同士を見て畳み込む for (ll i = 0; i < len - 1; i++) { ll prod_coef = (prod_l[i] * prod_r[i + 3]) % MOD; ll diff_c = idxs[i + 1][0] - idxs[i].back(); ll diff_l = idxs[i].back() - idxs[i][0]; ll diff_r = idxs[i + 1].back() - idxs[i + 1][0]; vector<ll> lefts(diff_l + 1, 0); vector<ll> rights(diff_r + 1, 0); for (ll x : idxs[i]) { lefts[idxs[i].back() - x]++; } for (ll x : idxs[i + 1]) { rights[x - idxs[i + 1][0]]++; } vector<ll> conv = convolution(lefts, rights); for (ll j = 0; j < conv.size(); j++) { ll plus = (prod_coef * conv[j]) % MOD; plus = (plus * pows_k[diff_c + j]) % MOD; ans = (ans + plus) % MOD; } } cout << ans << endl; }