【洛谷 P9420】[蓝桥杯 2023 国 B] 子 2023 _ 双子数 题解(分支+字符串+提交答案)

195 阅读1分钟

[蓝桥杯 2023 国 B] 子 2023 / 双子数

题目描述

A 子 2023

小蓝在黑板上连续写下从 1120232023 之间所有的整数,得到了一个数字序列:

S=1234567891011121320222023S = 12345678910111213\cdots 20222023

小蓝想知道 SS 中有多少种子序列恰好等于 20232023

提示,以下是 33 种满足条件的子序列(用中括号标识出的数字是子序列包含的数字):

1[2]34567891[0]111[2]1[3]141516171819202122231[\textbf2]34567891[\textbf0]111[\textbf2]1[\textbf3]14151617181920212223 \cdots

1[2]34567891[0]111[2]131415161718192021222[3]1[\textbf2]34567891[\textbf0]111[\textbf2]131415161718192021222[\textbf3] \cdots

1[2]34567891[0]111213141516171819[2]021222[3]1[\textbf2]34567891[\textbf0]111213141516171819[\textbf2]021222[\textbf3] \cdots

注意以下是不满足条件的子序列,虽然包含了 22002233 四个数字,但是顺序不对:

1[2]345678910111[2]131415161718192[0]21222[3]1[\textbf2]345678910111[\textbf2]131415161718192[\textbf0]21222[\textbf3] \cdots

B 双子数

若一个正整数 xx 可以被表示为 p2×q2p^2 \times q^2,其中 ppqq 为质数且 pqp \neq q,则 xx 是 一个 “双子数”。请计算区间 [2333,23333333333333][2333, 23333333333333] 内有多少个 “双子数”?

输入格式

输入一个大写字母,表示第几个问题。

输出格式

根据所输入的问题编号,输出对应问题的答案。

提示

答题模板,可供参考。

#include<iostream>
using namespace std;
int main() {
    string ans [] = {
        "The answer of task A", // 双引号中替换为 A 题的答案
        "The answer of task B", // 双引号中替换为 B 题的答案
    };
    char T;
    cin >> T;
    cout << ans[T - 'A'] << endl;
    return 0;
}

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 A、B 题


思路

首先定义一个字符串数组ans,其中包含两个元素,分别是两个问题的预计算答案。然后定义一个字符变量T,并从标准输入获取一个大写字母。这个字母对应于问题的编号。

接下来,利用ASCII码的特性,通过T - 'A'计算出输入字母对应的数组索引。例如,如果输入的是A,那么T - 'A'的结果就是0,对应于数组ans的第一个元素。如果输入的是B,那么T - 'A'的结果就是1,对应于数组ans的第二个元素。

最后,通过cout将查询到的答案输出到标准输出。

注意

这不是这道题的完整解法。你需要另外编写程序算出答案后,再用这个方法提交答案。A题可以用动态规划解决,B题可以用质数筛解决。


AC代码

#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
int main() {
	string ans[] = {
		"5484660609",	 // 双引号中替换为 A 题的答案
		"947293",	 // 双引号中替换为 B 题的答案
	};
	char T;
	cin >> T;
	cout << ans[T - 'A'] << endl;
	return 0;
}