-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathDigit Dp
68 lines (57 loc) · 1.61 KB
/
Digit Dp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
const int maxn = 1005;
int k;
int cs;
string v;
int dp[maxn][2][maxn][2];
int vis[maxn][2][maxn][2];
int solve(int pos, bool isSmall, int last, bool found){
if(pos == maxn) return found;
if(isSmall && vis[pos][isSmall][last][found]) return dp[pos][isSmall][last][found];
if(vis[pos][isSmall][last][found] == cs) return dp[pos][isSmall][last][found];
vis[pos][isSmall][last][found] = cs;
int cur = v[pos] - '0';
int lo = 0;
int hi = (isSmall ? 9 : cur);
int ret = 0;
for(int ch=lo; ch<=hi; ch++){
if(ch == 4 || ch == 7) ret += solve(pos+1, isSmall | (ch < cur), pos, found | (last && (pos - last <= k)));
else ret += solve(pos+1, isSmall | (ch < cur), last, found);
if(ret >= mod) ret -= mod;
}
return dp[pos][isSmall][last][found] = ret;
}
bool Check(string s){
int last = -1;
bool found = false;
for(int i=0; i < s.size(); i++){
if(s[i] == '4' || s[i] == '7') {
if(last >= 0 && (i - last <= k)) found = true;
last = i;
}
}
return found;
}
int solve(string s){
cs++;
reverse(s.begin(), s.end());
while(s.size() < maxn) s.push_back('0');
reverse(s.begin(), s.end());
v = s;
return solve(1, false, 0, false);
}
int main(){
int t;
scanf("%d %d",&t, &k);
while(t--){
string L, R;
cin >> L >> R;
int ans1 = solve(L);
int ans2 = solve(R);
int ans = ans2 - ans1 + Check(L);
if(ans < 0) ans += mod;
printf("%d\n", ans);
}
}