結果
| 問題 | No.189 SUPER HAPPY DAY |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-03-05 01:32:02 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 82 ms / 5,000 ms |
| コード長 | 3,500 bytes |
| 記録 | |
| コンパイル時間 | 3,195 ms |
| コンパイル使用メモリ | 354,588 KB |
| 実行使用メモリ | 10,496 KB |
| 最終ジャッジ日時 | 2026-03-05 01:32:08 |
| 合計ジャッジ時間 | 4,705 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using arr = array<int, 3>;
const ll mod = 1e9 + 9;
void Tsukikage() {
string M, D;
cin >> M >> D;
vector<ll> ans1(2010), ans2(2010);
vector memo(210, vector(2, vector<ll>(2010, -1)));
auto dfs = [&](auto dfs, string &s, int idx, bool limit, int sums) -> ll {
if (sums < 0) return 0;
if (idx == s.size()) {
return sums == 0 ? 1 : 0;
}
if (memo[idx][limit][sums] != -1) {
return memo[idx][limit][sums];
}
int up = limit ? s[idx] - '0' : 9;
ll res = 0;
for (int i = 0; i <= up; i++) {
res += dfs(dfs, s, idx + 1, limit and (i == up), sums - i);
res %= mod;
}
return memo[idx][limit][sums] = res;
};
for (int i = 1; i < 2010; i++) {
ans1[i] += dfs(dfs, M, 0, 1, i);
ans1[i] %= mod;
}
fill(memo.begin(), memo.end(), vector(2, vector<ll>(2010, -1)));
for (int i = 1; i < 2010; i++) {
ans2[i] += dfs(dfs, D, 0, 1, i);
ans2[i] %= mod;
}
// dfs(dfs, D, ans2, 0, true, 0);
// for (int d = 0; d <= 1; d++) {
// for (int i = 1; i < D.size(); i++) {
// ans2[i] += memo[D.size()][d][i];
// ans2[i] %= mod;
// }
// }
ll ans = 0;
for (int i = 1; i < 2010; i++) {
ans += ans1[i] * ans2[i] % mod;
ans %= mod;
}
cout << ans;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
// int _;
// for (cin >> _; _; _--)
Tsukikage();
return 0;
}
// #include <bits/stdc++.h>
// using namespace std;
// using ll = long long;
// using pii = pair<int, int>;
// using arr = array<int, 3>;
// const ll mod = 1e9 + 9;
// void Tsukikage() {
// string M, D;
// cin >> M >> D;
// vector<ll> ans1(M.size() * 10 + 30), ans2(D.size() * 10 + 30);
// vector memo(210, vector(2, vector<ll>(2010, -1)));
// auto dfs = [&](auto dfs, string &s, int idx, bool limit, int sums) -> ll {
// if (idx == s.size()) {
// return 1;
// }
// if (memo[idx][limit][sums] != -1) {
// return memo[idx][limit][sums];
// }
// int up = limit ? s[idx] - '0' : 9;
// ll res = 0;
// for (int i = 0; i <= up; i++) {
// res += dfs(dfs, s, idx + 1, limit and (i == up), sums + i);
// res %= mod;
// }
// return memo[idx][limit][sums] = res;
// };
// for (int i = 1; i < M.size(); i++) {
// ans1[i] += dfs(dfs, M, 0, 1, 0);
// ans1[i] %= mod;
// }
// fill(memo.begin(), memo.end(), vector(2, vector<ll>(2010, -1)));
// for (int i = 1; i < D.size(); i++) {
// ans2[i] += dfs(dfs, D, 0, 1, 0);
// ans2[i] %= mod;
// }
// // dfs(dfs, D, ans2, 0, true, 0);
// // for (int d = 0; d <= 1; d++) {
// // for (int i = 1; i < D.size(); i++) {
// // ans2[i] += memo[D.size()][d][i];
// // ans2[i] %= mod;
// // }
// // }
// ll ans = 0;
// for (int i = 1; i < min(ans1.size(), ans2.size()); i++) {
// ans += ans1[i] * ans2[i] % mod;
// ans %= mod;
// }
// cout << ans;
// }
// signed main() {
// ios::sync_with_stdio(false);
// cin.tie(0);
// // int _;
// // for (cin >> _; _; _--)
// Tsukikage();
// return 0;
// }