Advertisement
Dang_Quan_10_Tin

NEQUATION2

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