写了多天一直被打断的数位dp,终于写完了(丧)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=105;
const ll mod=1000000007;
ll f[maxn][15][5],T;
ll lim[maxn];
//f[i][j][k] 代表i位前驱位j第k种状态的个数
//k==0代表不确定,k==1代表下降,k==2代表上升
string s;
ll dfs(int pos,int pre,int turn,bool limit,bool pd) {
//第几位,前驱,状态,上界,判断前驱, 判断前导0
if(pos==0) return pd?0:1;
if(!limit && f[pos][pre][turn]!=-1) return f[pos][pre][turn];
int up=limit?lim[pos]:9;
ll ans=0;
for(int i=0; i<=up; ++i) {
if(turn==2 && i<pre) continue; //上升了下降
int nturn=0;//更新现在的状态
if(pd) nturn=0; //说明前面全是0
else if(i==pre) nturn=turn;
else if(i<pre) nturn=1;
else if(i>pre) nturn=2;
ans=(ans+dfs(pos-1,i,nturn,limit&&i==lim[pos],pd&&i==0))%mod;
}
if(!limit) return f[pos][pre][turn]=ans%mod;
else return ans%mod;
}
ll solve(string s){
for(int i=0;i<s.size();++i) {
lim[s.size()-i]=s[i]-'0';
}
memset(f,-1,sizeof(f));
ll ans=0;
for(int i=0; i<=lim[s.size()]; ++i){
ans=(ans+dfs(s.size()-1,i,0,true&&i==lim[s.size()],true && i==0))%mod;
}
return ans%mod;
}
int main(){
scanf("%lld",&T);
while(T--){
cin>>s;
cout<<solve(s)<<endl;
}
return 0;
}