这是AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=20,P=1e9+7;
LL f[N][10],l,r,k,b,t,power[N];//f[i][j]表示i位,最高位为j 的所有数字之和
void init()
{
power[0]=1;
for(int i=1;i<N;i++)power[i]=10*power[i-1]%P;
for(int i=0;i<=9;i++)f[1][i]=i;
for(int i=2;i<N;i++)
for(int j=0;j<=9;j++)
{
f[i][j]=j*power[i-1]%P;
for(int k=0;k<=9;k++)
f[i][j]=(f[i][j]+f[i-1][k])%P;
}
}
LL dp(LL n)
{
if(!n)return 0;
vector<int>nums;
while(n)nums.push_back(n%10),n/=10;
int sz=nums.size();
LL res=0,s=nums[sz-1];
for(int i=1;i<s;i++)res=(res+f[sz][i])%P;//比X小的
for(int i=nums.size()-2;i>=0;i--)
{
int x=nums[i];
res=(res+power[i]*s*x)%P;// X自己
for(int j=0;j<x;j++)
res=(res+f[i+1][j])%P;//比X小的
s+=x;
}
for(int i=1;i<nums.size();i++)//前导0的部分
for(int j=1;j<=9;j++)
res=(res+f[i][j])%P;
return res;
}
int main()
{
init();
cin>>t;
while(t--)
{
cin>>l>>r;
cout<<((dp(r+1)-dp(l))%P+P)%P<<endl;
}
return 0;
}
但是把最后一行改为dp(r)-dp(l-1)就全WA,实在想不通为啥,其他数位dp题两种写法应该都是可以的(吧,不太确定,但我做过的都一样