考虑每个数字的每一位是彼此独立的,分开考虑。
发现 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 0,1,2,3,4,5,6,7,8,9 0,1,2,3,4,5,6,7,8,9操作若干次后都会到达一个相同的状态 10 10 10
于是我们单独考虑 10 10 10的状态转移即可
考虑 f [ i ] f[i] f[i]表示 10 10 10操作 i i i次后有多少数位
然后发现无法转移,因为位数的增加和 9 9 9个数的多少有关
所以重新定义状态 f [ i ] [ j ] f[i][j] f[i][j]表示操作 i i i次后,数位上为 j j j的个数为 f [ i ] [ j ] f[i][j] f[i][j]
所有数位都有转移
f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] f[i][j]=f[i-1][j-1] f[i][j]=f[i−1][j−1]
特殊的,对于 0 0 0和 1 1 1还可以由上次的 9 9 9转移而来
f [ i ] [ 0 ] + = f [ i − 1 ] [ 9 ] f[i][0]+=f[i-1][9] f[i][0]+=f[i−1][9]
f [ i ] [ 1 ] + = f [ i − 1 ] [ 9 ] f[i][1]+=f[i-1][9] f[i][1]+=f[i−1][9]
然后操作 i i i次后的数位个数就是 ∑ j = 0 9 f [ i ] [ j ] \sum\limits_{j=0}^9f[i][j] j=0∑9f[i][j]
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+19;
const int mod = 1e9+7;
int f[maxn][11],a[maxn],sum[maxn],n,m;
void init()
{
f[0][0] = f[0][1] = 1; sum[0] = 2;
for(int i=1;i<=200000;i++)
for(int j=0;j<=9;j++)
{
if( j ) f[i][j] = f[i-1][j-1];
if( j==0 || j==1 ) f[i][j] = ( 1ll*f[i][j]+f[i-1][9] )%mod;
sum[i] = ( 1ll*sum[i]+f[i][j] )%mod;
}
}
int main()
{
int t; cin >> t;
init();
while( t-- )
{
scanf("%d%d",&n,&m);
a[0] = 0;
while( n )
{
a[++a[0]] = n%10;
n /= 10;
}
long long ans = 0;
for(int i=1;i<=a[0];i++)
{
//达到10状态需要x步
int x = 10-a[i];
if( m<x ) ans = ( ans+1 )%mod;
else ans = ( ans+sum[m-x] )%mod;
}
printf("%lld\n",ans);
}
}