问题描述
小蓝在黑板上连续写下从 1 到 2023 之间所有的整数,得到了一个数字序列:
S = 12345678910111213...20222023
小蓝想知道:S 中有多少种子序列恰好等于 2023?
子序列的说明
子序列可以从原始序列中按原顺序选出若干字符,但不要求连续。
以下是满足条件的 3 种子序列示例(用中括号 []
标出选中的字符):
1[2]34567891[0]111[2]1[3]14151617181920212223...
1[2]34567891[0]111[2]131415161718192021222[3]...
1[2]34567891[0]111213141516171819[2]021222[3]...
以下是不满足条件的示例(虽然包含了 2、0、2、3,但顺序不对):
1[2]345678910111[2]131415161718192[0]21222[3]...
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。
- 本题的结果是一个整数
- 在提交答案时只填写这个整数
- 填写多余内容将无法得分
c++代码
#include<bits/stdc++.h>using namespace std;typedef long long ll;string father, son;
vector<ll> last, now;int main() {father += "#";for (ll i = 1; i <= 2023; i++) {father += to_string(i);}son = "#2023";//dp[i][j] = dp[i - 1][j] + (arr[i] == arr[j] ? dp[i - 1][j - 1]:0)ll n = father.size() - 1, m = son.size() - 1;last = vector<ll>(m + 1, 0), now = vector<ll>(m + 1, 0);last[0] = 1;for (ll i = 1; i <= n; i++) {for (ll j = 1; j <= m; j++) {now[j] += last[j];if (father[i] == son[j]) now[j] += last[j - 1];}last = now;now = vector<ll>(n + 1, 0);last[0] = 1;}cout << last[m];return 0;
}//by wqs