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 = 1e4 + 5;
- const ll mod = 1e9 + 69;
- int a[4];
- string n;
- int m;
- ll dp[N][5][205];
- void Read(){
- cin >> a[1] >> a[2] >> a[3] >> a[4] >> n;
- reverse(n.begin(), n.end());
- m = n.size() - 1;
- }
- /// 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ị
- /// 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
- /// Cho dễ thì đặt dp(i, 0, z) = dp(i - 1, 4, v)
- /// Cơ sở dp(0, 0, 0) = 1
- /// Đáp án là dp(m + 1, 0, 0) hay dp(m, 4, n[m] - '0')
- void Solve(){
- dp[0][0][0] = 1;
- for(int i = 0; i <= m; ++i){
- for(int j = 1; j <= 4; ++j)
- for(int t = 0; t < 200; ++t)
- for(int h = 0; h < 10; ++h)
- if(h * a[j] <= t)
- dp[i][j][t] = (dp[i][j][t] + dp[i][j - 1][t - a[j] * h]) % mod;
- for(int j = 0; j < 200; ++j)
- if(j % 10 == n[i] - '0')
- dp[i + 1][0][j / 10] = (dp[i + 1][0][j / 10] + dp[i][4][j]) % mod;
- }
- cerr << dp[m][4][n[m] - '0'] << " ";
- cout << dp[m + 1][0][0] % mod;
- }
- 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