Advertisement
Dang_Quan_10_Tin

EQUATION

Nov 18th, 2022
615
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #define task ""
  5. using namespace std;
  6. using ll = long long;
  7. using ld = long double;
  8.  
  9. const int N = 1e4 + 5;
  10. const ll mod = 1e9 + 69;
  11. int a[4];
  12. string n;
  13. int m;
  14. ll dp[N][5][205];
  15.  
  16. void Read(){
  17.     cin >> a[1] >> a[2] >> a[3] >> a[4] >> n;
  18.     reverse(n.begin(), n.end());
  19.     m = n.size() - 1;
  20. }
  21.  
  22. /// dp(i, j, k) là xét đến chữ số thứ i của n, số thứ j trong 4 số và còn đang nhớ k đơn vị
  23. /// dp(i, j, k) = dp(i - 1, 4, v) + dp(i, 1, v') + dp(i, 2, v") + dp(i, 3, v"') + dp(i, 4, v"") với mọi bộ số v / 10 + v' + v" + v"' + v"" = k
  24. /// Cho dễ thì đặt dp(i, 0, z) = dp(i - 1, 4, v)
  25. /// Cơ sở dp(0, 0, 0) = 1
  26. /// Đáp án là dp(m + 1, 0, 0) hay dp(m, 4, n[m] - '0')
  27.  
  28. void Solve(){
  29.     dp[0][0][0] = 1;
  30.     for(int i = 0; i <= m; ++i){
  31.         for(int j = 1; j <= 4; ++j)
  32.             for(int t = 0; t < 200; ++t)
  33.                 for(int h = 0; h < 10; ++h)
  34.                     if(h * a[j] <= t)
  35.                         dp[i][j][t] = (dp[i][j][t] + dp[i][j - 1][t - a[j] * h]) % mod;
  36.         for(int j = 0; j < 200; ++j)
  37.             if(j % 10 == n[i] - '0')
  38.                 dp[i + 1][0][j / 10] = (dp[i + 1][0][j / 10] + dp[i][4][j]) % mod;
  39.     }
  40.     cerr << dp[m][4][n[m] - '0'] << " ";
  41.     cout << dp[m + 1][0][0] % mod;
  42. }
  43.  
  44. main(){
  45.     ios::sync_with_stdio(0);
  46.     cin.tie(0);
  47.     cout.tie(0); if(fopen(task".INP", "r"))
  48.     freopen(task".INP", "r", stdin),
  49.     freopen(task".OUT", "w", stdout);
  50.     Read();
  51.     Solve();
  52. }
  53.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement