Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int N = 2004, MOD = 1e9+7;
- int m, d;
- string l, r;
- int num, a[N], b[N], dp[N][N][2][2];
- int calc(int pos, int mod, int flag, int flag2) {
- if (pos == num+1) return (mod == 0);
- int &foo = dp[pos][mod][flag][flag2];
- if (foo != -1) return foo; foo = 0;
- int Begin, End;
- if (pos % 2 == 0) {
- Begin = End = d;
- if (d < a[pos] && !flag) return 0;
- if (d > b[pos] && !flag2) return 0;
- }
- else {
- Begin = (flag) ? 0 : a[pos];
- End = (flag2) ? 9 : b[pos];
- }
- // cerr << pos << " " << mod << " " << flag << " " << flag2 << " --> " << Begin << " " << End << '\n';
- for (int dig = Begin; dig <= End; ++dig) {
- if (pos % 2 == 1 && dig == d) continue;
- int nMod = (mod * 10 + dig) % m;
- int nFlag = ( flag | (dig>a[pos]) );
- int nFlag2 = ( flag2 | (dig<b[pos]) );
- foo += calc(pos+1, nMod, nFlag, nFlag2); foo %= MOD;
- }
- return foo;
- }
- int process() {
- num = (int) l.length();
- for (int i = 1; i <= num; ++i) a[i] = l[i-1] - '0';
- for (int i = 1; i <= num; ++i) b[i] = r[i-1] - '0';
- memset(dp, -1, sizeof(dp));
- int res = calc(1, 0, 0, 0);
- return res;
- }
- int check(string lim) {
- return 0;
- int mod = 0; bool ok = true;
- for (int i = 0; i < (int) lim.length(); ++i) {
- mod = (mod * 10 + lim[i] - '0') % m;
- if (i % 2 == 1 && lim[i] - '0' != d) { ok = false; break; }
- }
- return (ok && mod == 0);
- }
- int main() {
- //freopen("input.txt", "r", stdin);
- cin >> m >> d >> l >> r;
- int res = (process() + check(l)) % MOD;
- cout << res << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment