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题解(预处理)(详细注释)的主要内容,如果未能解决你的问题,请参考以下文章
Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined)G - Bandit Blues
听力Why Can’t You Divide by Zero?
CWE-369:Divide By Zero除数有可能为零缺陷是如何产生的?