結果
| 問題 | No.372 It's automatic |
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2026-01-05 14:45:01 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,187 bytes |
| 記録 | |
| コンパイル時間 | 3,162 ms |
| コンパイル使用メモリ | 340,648 KB |
| 実行使用メモリ | 7,852 KB |
| 最終ジャッジ日時 | 2026-01-05 14:45:50 |
| 合計ジャッジ時間 | 37,480 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | AC * 5 WA * 18 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
static const long long MOD = 1000000007;
int main() {
string S;
int M;
cin >> S >> M;
// dp[state][mod]
vector<vector<long long>> dp(3, vector<long long>(M, 0));
dp[0][0] = 1; // 何も選んでいない
for (char c : S) {
int x = c - '0';
auto ndp = dp; // 「使わない」遷移
for (int st = 0; st < 3; st++) {
for (int m = 0; m < M; m++) {
long long v = dp[st][m];
if (v == 0) continue;
if (st == 0) {
// 初めて選ぶ
int nst = 1;
int nm = x % M;
ndp[nst][nm] = (ndp[nst][nm] + v) % MOD;
} else {
// 2文字以上
int nst = 2;
int nm = (m * 10 + x) % M;
ndp[nst][nm] = (ndp[nst][nm] + v) % MOD;
}
}
}
dp.swap(ndp);
}
long long ans = 0;
// 長さ1
ans = (ans + dp[1][0]) % MOD;
// 長さ2以上
ans = (ans + dp[2][0]) % MOD;
cout << ans << '\n';
return 0;
}
norioc