結果
| 問題 | No.3566 Subsequence Sum |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-06-06 09:56:37 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 154 ms / 2,000 ms |
| コード長 | 2,515 bytes |
| 記録 | |
| コンパイル時間 | 2,713 ms |
| コンパイル使用メモリ | 345,524 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-06-06 09:56:42 |
| 合計ジャッジ時間 | 4,896 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge1_1 |
| 純コード判定待ち |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 15 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/modint>
using namespace std;
using mint = atcoder::modint998244353;
template <class T>
struct Matrix {
int h = 0, w = 0;
vector<vector<T>> a;
Matrix(int h, int w, T value = T{}) : h(h), w(w), a(h, vector<T>(w, value)) {}
Matrix(initializer_list<initializer_list<T>> rows)
: h((int)rows.size()),
w(rows.size() == 0 ? 0 : (int)rows.begin()->size()) {
a.reserve(h);
for (const auto& row : rows) {
assert((int)row.size() == w);
a.emplace_back(row);
}
}
static Matrix identity(int n) {
Matrix res(n, n);
for (int i = 0; i < n; i++) res[i][i] = T{1};
return res;
}
vector<T>& operator[](int i) { return a[i]; }
const vector<T>& operator[](int i) const { return a[i]; }
Matrix operator*(const Matrix& other) const {
assert(w == other.h);
Matrix res(h, other.w);
for (int i = 0; i < h; i++) {
for (int k = 0; k < w; k++) {
for (int j = 0; j < other.w; j++) {
res[i][j] += a[i][k] * other[k][j];
}
}
}
return res;
}
vector<T> operator*(const vector<T>& v) const {
assert(w == (int)v.size());
vector<T> res(h);
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
res[i] += a[i][j] * v[j];
}
}
return res;
}
Matrix pow(long long exp) const {
assert(h == w);
assert(exp >= 0);
Matrix base = *this;
Matrix res = identity(h);
while (exp > 0) {
if (exp & 1LL) res = res * base;
base = base * base;
exp >>= 1LL;
}
return res;
}
};
int main() {
string N;
int K;
cin >> N >> K;
Matrix<mint> M = Matrix<mint>::identity(20);
array<mint, 20> cnt_row{}, sum_row{};
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 10; j++) {
cnt_row[i] += M[j][i];
sum_row[i] += M[10 + j][i];
}
}
for (char ch : N) {
int x = ch - '0';
auto pre_c_row = M[x];
auto pre_s_row = M[10 + x];
vector<mint> new_c_row(20), new_s_row(20);
for (int i = 0; i < 20; i++) {
new_c_row[i] = cnt_row[i];
new_s_row[i] = x * cnt_row[i] + 10 * sum_row[i];
}
M[x] = new_c_row;
M[10 + x] = new_s_row;
for (int i = 0; i < 20; i++) {
cnt_row[i] += new_c_row[i] - pre_c_row[i];
sum_row[i] += new_s_row[i] - pre_s_row[i];
}
}
vector<mint> v(20);
v[0] = 1;
v = M.pow(K) * v;
mint ans = 0;
for (int i = 0; i < 10; i++) {
ans += v[10 + i];
}
cout << ans.val() << endl;
}