Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #define task ""
- using namespace std;
- using ll = long long;
- using ld = long double;
- const int N = 5e2 + 5;
- const ll mod = 1e9 + 7;
- int a[N];
- string n;
- int m, k;
- ll dp[N][2][12][2005];
- void Read()
- {
- cin >> k >> m;
- for (int i = 1; i <= k; ++i) {
- cin >> a[i];
- m -= a[i];
- }
- if(m < 0) {
- cout << 0;
- exit(0);
- }
- n = to_string(m);
- reverse(n.begin(), n.end());
- m = n.size() - 1;
- }
- void Solve()
- {
- dp[0][0][0][0] = 1;
- for (int i = 0; i <= m; ++i)
- {
- for (int j = 1; j <= k; ++j)
- for (int t = 0; t < 2000; ++t)
- for (int h = 0; h < 10; ++h)
- if (h * a[j] <= t)
- {
- dp[i][0][j][t] = (dp[i][0][j][t] + dp[i][0][j - 1][t - a[j] * h]) % mod;
- dp[i][1][j][t] = (dp[i][1][j][t] + dp[i][1][j - 1][t - a[j] * h]) % mod;
- }
- for (int j = 0; j < 2000; ++j)
- if (j % 10 < n[i] - '0')
- {
- dp[i + 1][0][0][j / 10] = (dp[i + 1][0][0][j / 10] + dp[i][0][k][j]) % mod;
- dp[i + 1][0][0][j / 10] = (dp[i + 1][0][0][j / 10] + dp[i][1][k][j]) % mod;
- }
- else if (j % 10 > n[i] - '0')
- {
- dp[i + 1][1][0][j / 10] = (dp[i + 1][1][0][j / 10] + dp[i][0][k][j]) % mod;
- dp[i + 1][1][0][j / 10] = (dp[i + 1][1][0][j / 10] + dp[i][1][k][j]) % mod;
- }
- else
- {
- dp[i + 1][0][0][j / 10] = (dp[i + 1][0][0][j / 10] + dp[i][0][k][j]) % mod;
- dp[i + 1][1][0][j / 10] = (dp[i + 1][1][0][j / 10] + dp[i][1][k][j]) % mod;
- }
- }
- cout << dp[m + 1][0][0][0] % mod;
- }
- int32_t main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- if (fopen(task ".INP", "r"))
- freopen(task ".INP", "r", stdin),
- freopen(task ".OUT", "w", stdout);
- Read();
- Solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement