Advertisement
Dang_Quan_10_Tin

NEQUATION

Nov 25th, 2022 (edited)
533
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 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 = 5e2 + 5;
  10. const ll mod = 1e9 + 7;
  11. int a[N];
  12. string n;
  13. int m, k;
  14. ll dp[N][2][12][2005];
  15.  
  16. void Read()
  17. {
  18.     cin >> k >> n;
  19.  
  20.     for (int i = 1; i <= k; ++i)
  21.         cin >> a[i];
  22.  
  23.     reverse(n.begin(), n.end());
  24.     m = n.size() - 1;
  25. }
  26.  
  27. void Solve()
  28. {
  29.     dp[0][0][0][0] = 1;
  30.     for (int i = 0; i <= m; ++i)
  31.     {
  32.         for (int j = 1; j <= k; ++j)
  33.             for (int t = 0; t < 2000; ++t)
  34.                 for (int h = 0; h < 10; ++h)
  35.                     if (h * a[j] <= t)
  36.                     {
  37.                         dp[i][0][j][t] = (dp[i][0][j][t] + dp[i][0][j - 1][t - a[j] * h]) % mod;
  38.                         dp[i][1][j][t] = (dp[i][1][j][t] + dp[i][1][j - 1][t - a[j] * h]) % mod;
  39.                     }
  40.  
  41.         for (int j = 0; j < 2000; ++j)
  42.             if (j % 10 < n[i] - '0')
  43.             {
  44.                 dp[i + 1][0][0][j / 10] = (dp[i + 1][0][0][j / 10] + dp[i][0][k][j]) % mod;
  45.                 dp[i + 1][0][0][j / 10] = (dp[i + 1][0][0][j / 10] + dp[i][1][k][j]) % mod;
  46.             }
  47.             else if (j % 10 > n[i] - '0')
  48.             {
  49.                 dp[i + 1][1][0][j / 10] = (dp[i + 1][1][0][j / 10] + dp[i][0][k][j]) % mod;
  50.                 dp[i + 1][1][0][j / 10] = (dp[i + 1][1][0][j / 10] + dp[i][1][k][j]) % mod;
  51.             }
  52.             else
  53.             {
  54.                 dp[i + 1][0][0][j / 10] = (dp[i + 1][0][0][j / 10] + dp[i][0][k][j]) % mod;
  55.                 dp[i + 1][1][0][j / 10] = (dp[i + 1][1][0][j / 10] + dp[i][1][k][j]) % mod;
  56.             }
  57.     }
  58.     cout << dp[m + 1][0][0][0] % mod;
  59. }
  60.  
  61. int32_t main()
  62. {
  63.     ios::sync_with_stdio(0);
  64.     cin.tie(0);
  65.     cout.tie(0);
  66.     if (fopen(task ".INP", "r"))
  67.         freopen(task ".INP", "r", stdin),
  68.             freopen(task ".OUT", "w", stdout);
  69.     Read();
  70.     Solve();
  71. }
  72.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement