题目链接:
https://codeforces.com/contest/1513/problem/C
题目大意:
给定一个数n和一个m,每一个的操作,让n的每一位加上1,求出执行m次操作后,n的长度。
思路:
1.开一个k数组和一个ans数组
2.ans[x]存的是,让执行x次后,0这个数字产生的长度。
3.k[x]存的是当执行i次后,x这个数字的个数。
4.然后每一次的遍历,ans[i]的计算就是0到9的个数
5.具体见代码。
AC代码:
#include<bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
const int N=3e5+10;
const int mod=1e9+7;
typedef long long ll;
ll k[10];
ll dp[N];
int main()
{
IOS //这题会卡常数
k[0]=1;
dp[0]=1;
ll ans=0;
for(int i=1;i<=N;i++) //把所有的都预处理出来
{
ans=0;
ll z=k[9]; //把上一个状态的9的个数存一下,因为新的0的个数的就是上一个状态9的个数
for(int j=9;j>0;j--)
{
k[j]=k[j-1]; //加上一以后,例如,8从7加过来,那么8的个数就是7的个数
}
k[0]=z;//到进位时,9+1=10 0的个数就是9的个数
k[1]+=z;//1的个数还要加上上一个状态9的个数
k[1]%=mod;
for(int j=0;j<=9;j++)
{
ans+=k[j];
ans%=mod; //加上0-9的数字的个数
}
dp[i]=ans%mod;//执行第i次,产生的长度
}
ll t;
cin>>t;
while(t--)
{
string a; ll m;
cin>>a;
cin>>m;
ll ansx=0;
for(auto it:a)
{
ansx+=(dp[m+it-'0']);// 把所有数字看成0,0执行m次,2就执行m+2次。
ansx%=mod;
}
cout<<ansx<<"\n";
}
return 0;
}