【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;
}
posted @ 2023-09-11 09:57  Alric  阅读(18)  评论(0编辑  收藏  举报