Luogu-3413 SAC#1 - 萌数
吐槽一下自己代码里长的一匹的状态...
\(f[1000][10][10][2][2][2][2]\)分别记录当前位,前一位值,前前位值,是否有前导零,是否前一个有前导零,是否有上限,是否已经满足条件
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+100,P=1e9+7;
int a[maxn],b[maxn],f[maxn][10][10][2][2][2][2],num;
char s[maxn];
void read(int *x){
scanf("%s",s+1);
x[0]=strlen(s+1);
for(int i=1,L=strlen(s+1);i<=L;i++)
x[i]=s[L-i+1]-'0';
}
int dfs(int *c,int wei,int last,int bef,int qdl,int bdl,int xz,int ok){
if(wei==0) return ok;
int &ans=f[wei][last][bef][qdl][bdl][xz][ok],lim=xz?c[wei]:9;
if(ans) return ans;
for(int i=0;i<=lim;i++){
int p=0;
if((!qdl&&last==i)||(!bdl&&bef==i))
p=1;
ans+=dfs(c,wei-1,i,last,qdl&&!i,qdl,xz&&i==lim,ok|p);
ans%=P;
}
return ans;
}
inline int work(int *c){
memset(f,0,sizeof(f));
return dfs(c,c[0],0,0,1,1,1,0);
}
int main(){
read(a),read(b);
for(int i=1;i<=a[0];i++)
if(a[i]==0) a[i]=9;
else{
a[i]--;
if(!a[i]&&i==a[0]) a[0]--;
break;
}
printf("%d\n",(work(b)-work(a)+P)%P);
return 0;
}