LINK

考虑每个数字的每一位是彼此独立的,分开考虑。

发现 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[i1][j1]

特殊的,对于 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[i1][9]

f [ i ] [ 1 ] + = f [ i − 1 ] [ 9 ] f[i][1]+=f[i-1][9] f[i][1]+=f[i1][9]

然后操作 i i i次后的数位个数就是 ∑ j = 0 9 f [ i ] [ j ] \sum\limits_{j=0}^9f[i][j] j=09f[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);
	}
}