第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 A: 子 2023
[蓝桥杯 2023 国 B] 子 2023
试题 A: 子 2023
【问题描述】
小蓝在黑板上连续写下从
1
1
1 到
2023
2023
2023 之间所有的整数,得到了一个数字序列:
S
=
12345678910111213
⋯
20222023
S = 12345678910111213cdots 20222023
S=12345678910111213⋯20222023
小蓝想知道
S
S
S 中有多少种子序列恰好等于
2023
2023
2023?
提示,以下是 3 3 3 种满足条件的子序列(用中括号标识出的数字是子序列包含的数字):
1
[
2
]
34567891
[
0
]
111
[
2
]
1
[
3
]
14151617181920212223
⋯
1[textbf2]34567891[textbf0]111[textbf2]1[textbf3]14151617181920212223 cdots
1[2]34567891[0]111[2]1[3]14151617181920212223⋯
1
[
2
]
34567891
[
0
]
111
[
2
]
131415161718192021222
[
3
]
⋯
1[textbf2]34567891[textbf0]111[textbf2]131415161718192021222[textbf3] cdots
1[2]34567891[0]111[2]131415161718192021222[3]⋯
1
[
2
]
34567891
[
0
]
111213141516171819
[
2
]
021222
[
3
]
⋯
1[textbf2]34567891[textbf0]111213141516171819[textbf2]021222[textbf3] cdots
1[2]34567891[0]111213141516171819[2]021222[3]⋯
注意以下是不满足条件的子序列,虽然包含了
2
2
2、
0
0
0、
2
2
2、
3
3
3 四个数字,但是顺序不对:
1
[
2
]
345678910111
[
2
]
131415161718192
[
0
]
21222
[
3
]
⋯
1[textbf2]345678910111[textbf2]131415161718192[textbf0]21222[textbf3] cdots
1[2]345678910111[2]131415161718192[0]21222[3]⋯
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
string s;
for(int i=1;i<=2023;i++) s+=to_string(i);
LL a=0;//2 de data
LL b=0;//20 de data
LL c=0;//202 de data
LL d=0;//2023 de data
for(int i=0;i<s.size();i++)
{
if(s[i]=='2')
{
a++;
c+=b;
}
if(s[i]=='0') b+=a;
if(s[i]=='3') d+=c;
}
cout<<d;//5484660609
return 0;
}