結果
問題 |
No.3242 Count 8 Included Numbers (Hard)
|
ユーザー |
![]() |
提出日時 | 2025-06-18 09:07:24 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,257 bytes |
コンパイル時間 | 921 ms |
コンパイル使用メモリ | 76,964 KB |
実行使用メモリ | 52,888 KB |
最終ジャッジ日時 | 2025-06-18 09:10:37 |
合計ジャッジ時間 | 5,083 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 8 WA * 12 |
ソースコード
#include <iostream> #include <vector> using namespace std; using ll = long long; ll mod = 998244353; int main() { string N; cin >> N; ll len = N.size(); bool inc_8 = false; vector<vector<ll>> dp(len, vector<ll>(2, 0)); // 0 も含めて数えて OK if (N[0] == '8') { inc_8 = true; dp[0][0] = 8; } else if (N[0] == '9') { dp[0][0] = 8; dp[0][1] = 1; } else { dp[0][0] = (ll)(N[0] - '0'); } for (ll i = 1; i < len; i++) { if (N[i] == '8') { inc_8 = true; } // テーブル内の遷移 dp[i][0] = (dp[i - 1][0] * 9) % mod; dp[i][1] = (dp[i - 1][0] + dp[i - 1][1] * 10) % mod; // テーブルに新たに入ってくる遷移 ll cnt_0, cnt_1; if (N[i] == '9') { cnt_0 = 8; cnt_1 = 1; } else { cnt_0 = (ll)(N[i] - '0'); cnt_1 = 0; } if (inc_8) { dp[i][1] += (cnt_0 + cnt_1); dp[i][1] %= mod; } else { dp[i][0] = (dp[i][0] + cnt_0) % mod; dp[i][1] = (dp[i][1] + cnt_1) % mod; } } ll plus = (inc_8); cout << (dp[len - 1][1] + plus) % mod << endl; }