求助大佬自己想的 数位DP,和题解不太一样。
fi,j,k 表示在未填满的情况下,第 k 位前面两个数分别选 i−1,j−1 时,有多少方案。
#define N 1005
#define P 1000000007
#define D 15
char a[N],b[N];
int _[N],Pow[N];
long f[N][D][D];
int qpow(int a,int b){
int res=1;
for(;b;b>>=1,a=1ll*a*a%P)
if(b&1) res=1ll*res*a%P;
return res;
}
DFS(d,p1,p2,z,fu){
if(!d) return 0;
if(!fu&&~f[d][p1+1][p2+1])
return f[d][p1+1][p2+1];
long up=fu?_[d]:9,ans=0;
for(int i=0,p;i<=up;++i){
p=z&&!i?-1:i;
if(!(fu&&i==up)&&~p&&(p==p1||p==p2))
ans=(ans+Pow[d-1])%P;
else
ans=(ans+DFS(d-1,p,p1,z&&!i,fu&&i==up))%P;
}
if(!fu) f[d][p1+1][p2+1]=ans;
return ans;
}
long work(char*s){
int l=strlen(s+1);
for(int i=l;i;--i)
_[l-i+1]=s[i]^48;
return DFS(l,-1,-1,1,1);
}
main(){
memset(f,0xff,sizeof f);
scanf("%s%s",a+1,b+1);
for(int i=*Pow=1;i<N;++i)
Pow[i]=1ll*Pow[i-1]*10%P;
if(b[1]=='0')
return printf("Unexpected"),0;
int l=strlen(a+1);
for(;a[l]<'0'&&a[l-1];)
a[l]='9',--a[--l];
printf("%d",(work(b)-work(a)+P+1)%P);
}