给定k,求[l,r]内lucky number个数。r的范围到1e1000。
1.lucky number是至少存在2个lucky digit的距离小于等于k,并不要求所有都小于等于k。
lucky digit是4和7.
2.lpos的范围也是maxn = 1000 + 5
//f(r) - f(l - 1) == f(r) - f(l) + (l符合) ? 1 : 0
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
const int maxn = 1000 + 5;
int dp[maxn][maxn][2];
int bits[maxn];
int t,k;
ll dfs(int len,int lpos,int fg,bool border)//fg为true表示,存在2个lucky digit距离小于等于k
{
if(!len) return fg == 1;
if(!border && dp[len][lpos][fg] != -1) return dp[len][lpos][fg];
int up = border ? bits[len] : 9;
ll res = 0 ;
for (int i = 0; i <= up; i ++) {
if(i == 4 || i == 7)
{
res += dfs(len - 1, len, (lpos && lpos - len <= k) | fg, border && i == up);
}
else res += dfs(len - 1, lpos, fg, border && i == up);
}
res %= mod;
if(!border) dp[len][lpos][fg] = res;
return res;
}
ll f(string s)
{
int len = 0;
for (int i = s.size() - 1; i >= 0; i --) {
bits[++ len] = s[i] - '0';
}
return dfs(len,0,0,1);
}
bool check(string &s)//
{
int p = 0;
for (int i = 1; i <= s.size(); i ++) {
if (s[i - 1] == '4' || s[i - 1] == '7') {
if(!p || i - p > k) p = i;
else if(i - p <= k) return true;
}
}
return false;
}
int main()
{
cin >> t >> k;
string l,r;
memset(dp, -1, sizeof(dp));
for (int i = 0; i < t; i ++) {
cin >> l >> r;
ll ans = f(r) - f(l) + (check(l) ? 1 : 0);
cout << (ans % mod + mod) % mod << endl;//
}
return 0;
}