【Codeforces1513C】Add One(动态规划)
题目大意:
给\(n(1\le n\le 10^9)\)的每个数码加一,重复\(m(1\le m\le 2\times 10^5)\)次,求最终结果的长度,询问\(t(1\le t\le 2\times 10^5)\)次。
设\(dp_{i}\)为数字\(0\)经过\(i\)次操作后,得到结果的长度。
\(dp_{i}=\begin{cases}1,0\le i\le 9\\2,i=10\\dp_{i-9}+dp_{i-10},i>10\end{cases}\)
在查询前先预处理出所有\(dp_{i}\)的值。
查询时,对于数码\(x\),结果即为\(dp_{m+x}\),最终答案即为\(n\)所有数码结果的和。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll m,dp[200000+20];
char n[20],nlen;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
for(ll i=0;i<=200000+10;i++){
if(i<=9)dp[i]=1;
else if(i==10)dp[i]=2;
else dp[i]=(dp[i-9]+dp[i-10])%mod;
}
while(T--){
ll ans=0;
cin >> (n+1) >> m;
nlen=strlen(n+1);
for(ll i=1;i<=nlen;i++){
ans+=dp[m+(n[i]-'0')];
ans%=mod;
}
cout << ans << endl;
}
return 0;
}