結果
| 問題 |
No.3247 Multiplication 8 2
|
| コンテスト | |
| ユーザー |
AngrySadEight
|
| 提出日時 | 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;
}
AngrySadEight