問題
https://codeforces.com/contest/1513/problem/C
問題概要
整数n
とm
が与えられる。n
の各桁の数に1を加えたものを並べた列を新しいn
に置き換える操作をm
回繰り返したとき、n
が何桁になっているか答えよ。
考察
とりあえず0からスタートしてどうなるか見てみます。
数 | 桁数 |
---|---|
0 | 1 |
1 | 1 |
2 | 1 |
3 | 1 |
4 | 1 |
5 | 1 |
6 | 1 |
7 | 1 |
8 | 1 |
9 | 1 |
10 | 2 |
21 | 2 |
32 | 2 |
43 | 2 |
54 | 2 |
65 | 2 |
76 | 2 |
87 | 2 |
98 | 2 |
109 | 3 |
2110 | 4 |
3221 | 4 |
桁数の列をOEISにぶち込んでみます。
なんと、ありました。というわけで、ここで示された漸化式「n < 10
のときa(n) = 1
, n>=10
のときa(n) = a(n - 9) + a(n - 10)
」でm
の制約である2*10^5+10
ほどを前計算しておき、n
の各桁の数d_i
に対してa(m + d_i)
を求めて合算したものが答えです。
しかし、i
番目の数がi-9
番目とi-10
番目の数を連結してできるというのは(並べてみれば)分かるのですが、なぜそうなるのかはわかりません。(おい
#include <bits/stdc++.h> using namespace std; const int MOD = 1000000007; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); vector<int> f(200020); for (int i = 0; i < 10; i++) f[i] = 1; for (int i = 10; i < 200020; i++) { f[i] = f[i - 9] + f[i - 10]; f[i] %= MOD; } int t; cin >> t; while (t--) { string s; int m; cin >> s >> m; int ans = 0; for (char c : s) { ans += f[m + (int)(c - '0')]; ans %= MOD; } cout << ans << endl; } }