結果
問題 | No.189 SUPER HAPPY DAY |
ユーザー |
![]() |
提出日時 | 2020-02-24 20:52:32 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 78 ms / 5,000 ms |
コード長 | 3,361 bytes |
コンパイル時間 | 2,129 ms |
コンパイル使用メモリ | 168,096 KB |
実行使用メモリ | 43,264 KB |
最終ジャッジ日時 | 2024-10-12 12:14:33 |
合計ジャッジ時間 | 3,751 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 23 |
ソースコード
#include "bits/stdc++.h"using namespace std;typedef long long ll;template<long long mod>struct mint {private:long long x;public:mint(long long x = 0) :x((mod + x) % mod) {}mint(std::string &s) {long long z = 0;for (int i = 0; i < s.size(); i++) {z *= 10;z += s[i] - '0';z %= mod;}this->x = z;}mint& operator+=(const mint &a) {if ((x += a.x) >= mod) x -= mod;return *this;}mint& operator-=(const mint &a) {if ((x += mod - a.x) >= mod) x -= mod;return *this;}mint& operator*=(const mint &a) {(x *= a.x) %= mod;return *this;}mint& operator/=(const mint &a) {long long n = mod - 2;mint<mod> u = 1, b = a;while (n > 0) {if (n & 1) {u *= b;}b *= b;n >>= 1;}return *this *= u;}mint operator+(const mint &a) const {mint res(*this);return res += a;}mint operator-(const mint &a) const {mint res(*this);return res -= a;}mint operator*(const mint &a) const {mint res(*this);return res *= a;}mint operator/(const mint &a) const {mint res(*this);return res /= a;}friend std::ostream& operator<<(std::ostream &os, const mint &n) {return os << n.x;}bool operator==(const mint &a) const {return this->x == a.x;}};int sum(int x) {int res = 0;while (x) {res += x % 10;x /= 10;}return res;}int main() {constexpr int MOD = 1e9 + 9;string m, d; cin >> m >> d;vector<vector<vector<mint<MOD>>>> dp(m.size() + 1, vector<vector<mint<MOD>>>(m.size() * 9 + 1, vector<mint<MOD>>(2, 0)));vector<vector<vector<mint<MOD>>>> dp2(d.size() + 1, vector<vector<mint<MOD>>>(d.size() * 9 + 1, vector<mint<MOD>>(2, 0)));dp[0][0][0] = 1;dp2[0][0][0] = 1;for (int i = 0; i < m.size(); i++) {for (int j = 0; j <= m.size() * 9; j++) {if (j + m[i] - '0' <= m.size() * 9) dp[i + 1][j + m[i] - '0'][0] += dp[i][j][0];for (int k = 0; k < 10; k++) {if (j + k <= m.size() * 9) dp[i + 1][j + k][1] += dp[i][j][1];else break;}for (int k = 0; k < m[i] - '0'; k++) {if (j + k <= m.size() * 9) dp[i + 1][j + k][1] += dp[i][j][0];else break;}}}for (int i = 0; i < d.size(); i++) {for (int j = 0; j <= d.size() * 9; j++) {if (j + d[i] - '0' <= d.size() * 9) dp2[i + 1][j + d[i] - '0'][0] += dp2[i][j][0];for (int k = 0; k < 10; k++) {if (j + k <= d.size() * 9) dp2[i + 1][j + k][1] += dp2[i][j][1];else break;}for (int k = 0; k < d[i] - '0'; k++) {if (j + k <= d.size() * 9) dp2[i + 1][j + k][1] += dp2[i][j][0];else break;}}}mint<MOD> ans = 0;for (int i = 1; i <= min(d.size(), m.size()) * 9; i++) {ans += (dp[m.size()][i][0] + dp[m.size()][i][1]) * (dp2[d.size()][i][0] + dp2[d.size()][i][1]);}cout << ans << endl;return 0;}