Add One
题意:
给一个数n, 有m次操作,每次操作把n的每一位加一,例如1912操作一次后变成21023.问操作m次后,数字的位数。
思路:
可以初始化0~9每一个数字操作k次后的位数f[i]k(k<=m),然后把n的每一位操作后的长度加起来即可。
代码:
/*************************************************************************
> File Name: b.cpp
> Author: Beans
> Mail: 3112748286@qq.com
> Created Time: 2023/5/25 16:18:31
************************************************************************/
#include <iostream>
#include <algorithm>
#define int long long
#define endl '\n'
using namespace std;
const int maxn = 3e5 + 7;
const int mod = 1e9 + 7;
int n, m;
int f[10][maxn], vis[10];
void init(){
for(int k = 0; k <= 9; k ++ ){
for(int i = 0; i <= 9; i ++ ) vis[i] = 0;
vis[k] = 1;
for(int i = 1; i <= maxn - 1; i ++ ){
int cnt = 0;
for(int j = 9; j >= 0; j -- ){
if(j < 9){
vis[j + 1] = (vis[j + 1] + vis[j]) % mod;
vis[j] = 0;
}
else{
cnt = vis[j];
vis[j] = 0;
}
}
vis[0] = (vis[0] + cnt) % mod;
vis[1] = (vis[1] + cnt) % mod;
for(int j = 0; j <= 9; j ++ )
f[k][i] = (f[k][i] + vis[j]) % mod;
}
}
}
void solve(){
cin >> n >> m;
int ans = 0;
while(n){
ans = (ans + f[n % 10][m]) % mod;
n /= 10;
}
cout << ans << endl;
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
init();
while(t -- )
solve();
}