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

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

题目描述

A 子 2023

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

S = 12345678910111213 ⋯ 20222023 S = 12345678910111213\cdots 20222023 S=1234567891011121320222023

小蓝想知道 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]

B 双子数

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

输入格式

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

输出格式

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

提示

答题模板,可供参考。

import java.util.Scanner;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        HashMap<Character, String> answers = new HashMap<>();
        answers.put('A', "The answer of task A"); // 双引号中替换为 A 题的答案
        answers.put('B', "The answer of task B"); // 双引号中替换为 B 题的答案
        
        Scanner scanner = new Scanner(System.in);
        char T = scanner.next().charAt(0);
        
        System.out.println(answers.getOrDefault(T, "Invalid input")); // 输出答案,如果没有对应键,则输出 "Invalid input"
        
        scanner.close();
    }
}

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

原理:1.初始化数组dp的四个元素分别对应“2”、“20”、“202”和“2023”的累计数量。
     2.遍历构造的字符串s,每当遇到字符'2'时,我们知道一个“2”出现了,因此更新dp[0];同时我们知道每              个“202”之前必然有一个“20”,所以每次看到'2'时,已经存在的“20”的数量会转化为新的“202”的数量,故更        新dp[2]。
     3.当遇到字符'0'时,由于它只能与前面的'2'组成“20”,所以更新dp[1],将其加上当前的“2”的数量dp[0]。
     4.当遇到字符'3'时,考虑到每个“2023”之前必然有个“202”,所以更新dp[3],将其加上当前的“202”的数量          dp[2]。

public class Main {
    public static void main(String[] args) {
        long[] dp = new long[4]; // 分别代表"2"、"20"、"202"、"2023"的累计数量
        StringBuilder s = new StringBuilder();

        // 构造string
        for (int i = 1; i <= 2023; i++) {
            s.append(Integer.toString(i));
        }

        // 遍历string
        for (int i = 0; i < s.length(); i++) {
            char currentChar = s.charAt(i);
            switch (currentChar) {
                case '2':
                    dp[0]++;//‘2’++
                    dp[2] += dp[1];‘20’转换成‘202’
                    break;
                case '0':
                    dp[1] += dp[0];‘2’转换成‘20’
                    break;
                case '3':
                    dp[3] += dp[2];‘202’转换成‘2023’
                    break;
            }
        }

        // 输出结果
        System.out.println(dp[3]);
    }
}

2.TaskB

import java.util.ArrayList;
import java.util.Arrays;

public class PrimeSquareMultiplication {
    static boolean[] f = new boolean[10000010];
    static ArrayList<Integer> v = new ArrayList<>();

    public static void main(String[] args) {
        Arrays.fill(f, false);
        f[0] = f[1] = true; // 初始化f数组,0和1不是质数
        for (int i = 2; i <= 10000010; i++) {
            if (!f[i]) { // 如果i未被标记,那么i是质数
                v.add(i);
                for (int j = 0; j < v.size() && v.get(j) * i <= 10000010; j++) {
                    f[v.get(j) * i] = true; // 标记以i为因子的数为合数
                    if (i % v.get(j) == 0) { // 如果v[j]是i的因子,那么之后的数都不需要检查
                        break;
                    }
                }
            }
        }

        long long ans = 0;
        for (int i = 0; i < v.size(); i++) {
            for (int j = i + 1; j < v.size(); j++) {
                if (v.get(i) * v.get(i) * v.get(j) * v.get(j) < 2333) {
                    continue; // 小于2333的不要,继续
                }
                if (v.get(i) * v.get(i) * v.get(j) * v.get(j) > 23333333333333L) {
                    break; // 大于23333333333333的直接退出
                }
                ans++;
            }
        }
        System.out.println(ans);
    }
}

最终答案:

import java.util.Scanner;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        HashMap<Character, String> answers = new HashMap<>();
        answers.put('A', "5484660609"); // 双引号中替换为 A 题的答案
        answers.put('B', "947293"); // 双引号中替换为 B 题的答案
        
        Scanner scanner = new Scanner(System.in);
        char T = scanner.next().charAt(0);
        
        System.out.println(answers.getOrDefault(T, "Invalid input")); // 输出答案,如果没有对应键,则输出 "Invalid input"
        
        scanner.close();
    }
}
  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值