Advertisement
tien_noob

628D Codeforces - DP Digit

Jun 6th, 2021
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. //Make CSP great again
  2. #include <bits/stdc++.h>
  3. #define TASK "TESTCODE"
  4. using namespace std;
  5. const int N = 2e3, mod = 1e9 + 7;
  6. string a, b;
  7. int m, d;
  8. int f[N + 1][2][N + 1];
  9. void read()
  10. {
  11.     cin >> m >> d >> a >> b;
  12. }
  13. int dp(string &s, int i, bool low, int remain)
  14. {
  15.     if (i == s.length())
  16.     {
  17.         return remain == 0;
  18.     }
  19.     int &res = f[i][low][remain];
  20.     if (res != -1)
  21.     {
  22.         return res;
  23.     }
  24.     res = 0;
  25.     int k = s[i] - '0';
  26.     if (low)
  27.     {
  28.         k = 9;
  29.     }
  30.     for (int j = 0; j <= k; ++ j)
  31.     {
  32.         if (i % 2 == 1 && j == d)
  33.         {
  34.             res += dp(s, i + 1, low | j < (s[i] - '0'), (remain * 10 + j) % m);
  35.             res %= mod;
  36.         }
  37.         else if (i % 2 == 0 && j != d)
  38.         {
  39.             res += dp(s, i + 1, low | j < (s[i] - '0'), (remain * 10 + j) % m);
  40.             res %= mod;
  41.         }
  42.     }
  43.     return res;
  44. }
  45. int Get(string &s)
  46. {
  47.     memset(f, -1, sizeof(f));
  48.     return dp(s, 0, 0, 0);
  49. }
  50. bool check()
  51. {
  52.     int sum = 0;
  53.     for (int i = 0; i < a.length(); ++ i)
  54.     {
  55.         sum = (sum * 10 + a[i] - '0') % m;
  56.         if (i % 2 == 1 && a[i] - '0' != d)
  57.         {
  58.             return false;
  59.         }
  60.         if (i % 2 == 0 && a[i] - '0' == d)
  61.         {
  62.             return false;
  63.         }
  64.     }
  65.     return sum == 0;
  66. }
  67. void solve()
  68. {
  69.     cout << (Get(b) - Get(a) + check() + mod) % mod;;
  70. }
  71. int main()
  72. {
  73.     ios_base::sync_with_stdio(false);
  74.     cin.tie(nullptr);
  75.     //freopen(TASK".INP", "r", stdin);
  76.     //freopen(TASK".OUT", "w", stdout);
  77.     int t = 1;
  78.     bool typetest = false;
  79.     if (typetest)
  80.     {
  81.         cin >> t;
  82.     }
  83.     for (int __ = 1; __ <= t; ++ __)
  84.     {
  85.         cerr << "Case " << __ << ": ";
  86.         read();
  87.         solve();
  88.     }
  89. }
  90.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement