結果
| 問題 |
No.2437 Fragile Multiples of 11
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-08-11 18:12:29 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 411 ms / 2,000 ms |
| コード長 | 1,797 bytes |
| コンパイル時間 | 2,347 ms |
| コンパイル使用メモリ | 210,672 KB |
| 最終ジャッジ日時 | 2025-02-16 00:45:41 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 34 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/modint>
#define rep(i, s, n) for (int i = int(s); i < int(n); i++)
using mint = atcoder::modint998244353;
int main() {
int n;
std::string x;
std::cin >> n >> x;
const int m = 11;
std::vector dp(m, std::vector(1 << m, std::vector<mint>(2, 0)));
bool is_top = true;
for (auto c : x) {
std::vector nxt(m, std::vector(1 << m, std::vector<mint>(2, 0)));
rep(i, 0, m) {
rep(bit, 0, 1 << m) {
int ret = 0;
rep(j, 0, m) {
if ((bit >> j) & 1) {
ret |= 1 << ((j * 10) % m);
}
}
rep(d, 0, 10) {
int nxt_bit = ret | (1 << i);
nxt[(i * 10 + d) % m][nxt_bit][0] += dp[i][bit][0];
if (d < c - '0') {
nxt[(i * 10 + d) % m][nxt_bit][0] += dp[i][bit][1];
} else if (d == c - '0') {
nxt[(i * 10 + d) % m][nxt_bit][1] += dp[i][bit][1];
}
ret <<= 1;
if ((ret >> m) & 1) {
ret ^= (1 << m) | 1;
}
}
}
}
rep(i, 1, 10) {
if (is_top) {
if (i == c - '0')
nxt[i][1][1]++;
else if (i < c - '0')
nxt[i][1][0]++;
else
continue;
} else
nxt[i][1][0]++;
}
dp = nxt;
is_top = false;
}
mint ans = 0;
rep(bit, 0, 1 << m) {
if (bit & 1) continue;
ans += dp[0][bit][0] + dp[0][bit][1];
}
std::cout << ans.val() << '\n';
}