結果
| 問題 |
No.741 AscNumber(Easy)
|
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 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;
}
norioc