結果
問題 |
No.741 AscNumber(Easy)
|
ユーザー |
![]() |
提出日時 | 2025-05-21 07:24:47 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,193 ms / 2,000 ms |
コード長 | 1,805 bytes |
コンパイル時間 | 935 ms |
コンパイル使用メモリ | 84,048 KB |
実行使用メモリ | 406,584 KB |
最終ジャッジ日時 | 2025-05-21 07:25:05 |
合計ジャッジ時間 | 17,633 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 55 |
ソースコード
#include <iostream> #include <vector> #include <string> using namespace std; const int MOD = 1'000'000'007; // 多次元 vector の初期化ユーティリティ vector<vector<vector<vector<int>>>> ndlist(int d1, int d2, int d3, int d4, int val = 0) { return vector<vector<vector<vector<int>>>>( d1, vector<vector<vector<int>>>( d2, vector<vector<int>>( d3, vector<int>(d4, val) ) ) ); } int digit_dp(const string& s) { vector<int> ds; for (char c : s) { ds.push_back(c - '0'); } int nd = ds.size(); auto dp = ndlist(nd + 1, 2, 2, 10, 0); // dp[i][j][k][m] // i: i桁目まで見た // j: n未満か(0: 完全一致, 1: より小さい) // k: leading zero(1: leading zero のまま, 0: 非leading) // m: 末尾の数字 dp[0][0][1][0] = 1; for (int i = 0; i < nd; ++i) { for (int j = 0; j < 2; ++j) { int to = (j == 0) ? ds[i] : 9; for (int k = 0; k < 2; ++k) { for (int m = 0; m < 10; ++m) { for (int x = m; x <= to; ++x) { int nj = j | (x < to); int nk = k & (x == 0); int nm = nk ? 0 : x; dp[i+1][nj][nk][nm] += dp[i][j][k][m]; if (dp[i+1][nj][nk][nm] >= MOD) dp[i+1][nj][nk][nm] -= MOD; } } } } } int res = 1; for (int i = 0; i < 10; ++i) { res += dp[nd][1][0][i]; if (res >= MOD) res -= MOD; } return res; } int main() { int N; cin >> N; string s = "1" + string(N, '0'); int ans = digit_dp(s); cout << ans << endl; return 0; }