WA了三个点,都是读到了负数
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int dp[10010][15][15];
string l,r,s;
inline void init()
{
for(int i=0;i<=9;i++)
for(int j=0;j<=9;j++)
if(i!=j)
++dp[2][i][j];
for(int i=3;i<=1000;++i)
for(int j=0;j<=9;++j)
for(int k=0;k<=9;++k)
{
if(k==j) continue;
for(int u=0;u<=9;++u)
if(k!=u&&j!=u)
dp[i][j][k]=(dp[i][j][k]+dp[i-1][k][u])%mod;
}
return;
}
int a[10010];
inline int Digit_DP(string str)
{
memset(a,0,sizeof a);
int num=str.size(),ans=0,sum=0,p=1;
if(num==1) return 0;
for(int i=num;i>=1;--i)
a[i]=str[num-i]-'0',sum=(sum*10+a[i])%mod;
sum=(sum+1)%mod;
ans+=10;
for(int i=2;i<num;++i)
for(int j=1;j<=9;++j)
for(int k=0;k<=9;++k)
ans=(ans+dp[i][j][k])%mod;
int last=-1,last2=-1,now;
for(int i=num;i>=2;--i)
{
now=a[i];
for(int j=(i==num);j<now;++j)
for(int k=0;k<=9;++k)
if(last!=j&&last2!=j&&last!=k&&j!=k)
ans=(ans+dp[i][j][k])%mod;
if(last==now||last2==now) {p=0;break;}
last2=last,last=now;
}
if(p)
for(int i=0;i<=a[1];++i)
if(i!=last&&i!=last2)
ans=(ans+1)%mod;
return (sum-ans)%mod;
}
int n;
inline void read()
{
getline(cin,s);
for(n=0;n<s.size();++n)
{
if(s[n]==' ') break;
l+=s[n];
}
++n;
for(n;n<s.size();++n)
r+=s[n];
return;
}
int ans;
inline void getans()
{
ans=Digit_DP(r)-Digit_DP(l);
if(l[1]==l[0]) {ans=(ans+1)%mod;return;}
for(int i=2;i<l.size();++i)
if(l[i]==l[i-1]||(l[i]==l[i-2]))
{
ans=(ans+1)%mod;
return;
}
}
signed main()
{
init();
read();
getans();
cout<<ans;
return (0-0);
}