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

Posted 尘封陌路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

以上是关于Divide by Zero 2021 and Codeforces Round #714 (Div. 2) C Add One题解(预处理)(详细注释)的主要内容,如果未能解决你的问题,请参考以下文章

听力Why Can’t You Divide by Zero?

Divide by Zero 2017 D&E&F

CWE-369:Divide By Zero除数有可能为零缺陷是如何产生的?

Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined)G - Bandit Blues

codeforces 792C. Divide by Three

CodeForce-792C Divide by Three(数学)