Divide by Zero 2021 and Codeforces Round #714 (Div. 2) C Add One题解(预处理)(详细注释)

题目链接:
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;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值