蒟蒻 数位DP 0分求助
查看原帖
蒟蒻 数位DP 0分求助
246331
mystic_qwq楼主2024/6/15 17:55

求助大佬自己想的 数位DP,和题解不太一样。
fi,j,kf_{i,j,k} 表示在未填满的情况下,第 kk 位前面两个数分别选 i−1,j−1i-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);
}

2024/6/15 17:55
加载中...