第十四届蓝桥杯大赛软件赛省赛(Java 大学B组)

文章介绍了多项编程竞赛中的难题,包括如何计算阶乘和幸运数字、数组分割、矩形总面积、蜗牛运动路径优化、合并区域和最大开支等。这些问题涉及到了动态规划、贪心算法、图论和数学思维,旨在测试和提升程序员的算法设计和问题解决能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


试题 A: 阶乘求和

本题总分: 5 5 5


【问题描述】

  令 S = 1 ! + 2 ! + 3 ! + . . . + 202320232023 ! S = 1! + 2! + 3! + ... + 202320232023! S=1!+2!+3!+...+202320232023!,求 S S S 的末尾 9 9 9 位数字。
  提示:答案首位不为 0 0 0

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


420940313


通过竖式易知当 n ! ∣ 1 0 9 n!|10^9 n!∣109时, n ! n! n!对答案无贡献,我们将 n ! n! n!表示成 2 k 5 g n ! 2 k 5 g 2^k5^g\frac {n!}{2^k5^g} 2k5g2k5gn!可知 g ≥ 9 g\geq9 g9 n ! ∣ 1 0 9 n!|10^9 n!∣109成立,而当 n ≥ 40 n\geq40 n40 n ! 2 9 5 9 \frac {n!}{2^95^9} 2959n!有整数解。
有结论 ∑ n = 1 40 n ! ≡ ∑ n = 1 202320232023 n ! ( m o d 1 0 9 ) \sum_{n=1}^{40}n!\equiv\sum_{n=1}^{202320232023}n! \pmod{10^9} n=140n!n=1202320232023n!(mod109)

public class Main {
   

    public static void main(String ...args) {
    new Main().run(); }

    void run() {
   
        long ans = 0, fac = 1;
        for (int i = 1; i < 40; ++i) {
   
            fac = i * fac % 1000000000;
            ans = (ans + fac) % 1000000000;
        }
        System.out.println(ans);
    }
}

试题 B: 幸运数字

本题总分: 5 5 5


【问题描述】

  哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整数。例如 126 126 126 是十进制下的一个哈沙德数,因为 ( 126 ) 10 mod ⁡   ( 1 + 2 + 6 ) = 0 (126)_{10} \operatorname{mod}\ (1+2+6) = 0 (126)10mod (1+2+6)=0 126 126 126 也是八进制下的哈沙德数,因为 ( 126 ) 10 = ( 176 ) 8 (126)_{10} = (176)_8 (126)10=(176)8 ( 126 ) 10 mod ⁡   ( 1 + 7 + 6 ) = 0 (126)_{10} \operatorname{mod}\ (1 + 7 + 6) = 0 (126)10mod (1+7+6)=0;同时 126 126 126 也是 16 16 16 进制下的哈沙德数,因为 ( 126 ) 10 = ( 7 e ) 16 (126)_{10} = (7e)_{16} (126)10=(7e)16 ( 126 ) 10 mod ⁡   ( 7 + e ) = 0 (126)_{10} \operatorname{mod}\ (7 +e) = 0 (126)10mod (7+e)=0。小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为哈沙德数,那么这个数字就是幸运数字,第 1 1 1 至第 10 10 10 个幸运数字的十进制表示为: 1 , 2 , 4 , 6 , 8 , 40 , 48 , 72 , 120 , 126 ⋯ 1 , 2 , 4 , 6 , 8 , 40 , 48 , 72 , 120 , 126 \cdots 1,2,4,6,8,40,48,72,120,126。现在他想知道第 2023 2023 2023 个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


215040


没啥头绪,开搜

public class Main {
   

    public static void main(String ...args) {
    new Main().run(); }

    int getDivisor(int n, int d) {
   
        int divisor = 0;
        for (; n > 0; n /= d)
            divisor += n % d;
        return divisor;
    }

    boolean isLucker(int n) {
   
        if (n % getDivisor(n, 2) != 0) return false;
        if (n % getDivisor(n, 8) != 0) return false;
        if (n % getDivisor(n, 10) != 0) return false;
        if (n % getDivisor(n, 16) != 0) return false;
        return true;
    }

    void run() {
   
        long cnt = 0, target = 2023;
        for (int n = 1; ; ++n) {
   
            if (isLucker(n) && ++cnt == target) {
   
                System.out.println(n);
                break;
            }
        }
    }
}

试题 C: 数组分割

时间限制: 1.0 s 1.0\mathrm s 1.0s 内存限制: 512.0 M B 512.0\mathrm{MB} 512.0MB 本题总分: 10 10 10


【问题描述】

  小蓝有一个长度为 N N N 的数组 A = [ A 0 , A 1 , ⋯   , A N − 1 ] A = [A_0, A_1, \cdots, A_{N−1}] A=[A0,A1,,AN1]。现在小蓝想要从 A A A 对应的数组下标所构成的集合 I = { 0 , 1 , 2 , . . . , N − 1 } I = \{0, 1, 2, . . . , N − 1\} I={ 0,1,2,...,N1} 中找出一个子集 R 1 R_1 R1,那么 R 1 R_1 R1 I I I 中的补集为 R 2 R_2 R2。记 S 1 = ∑ r ∈ R 1 A r , S 2 = ∑ r ∈ R 2 A r S_1 =\sum_{r\in R_1}A_r,S_2 =\sum_{r\in R_2}A_r S1=rR1ArS2=rR2Ar,我们要求 S 1 S_1 S1 S 2 S_2 S2 均为偶数,请问在这种情况下共有多少种不同的 R 1 R_1 R1。当 R 1 R_1 R1 R 2 R_2 R2 为空集时我们将 S 1 S_1 S1 S 2 S_2 S2 视为 0 0 0

【输入格式】

  第一行一个整数 T T T,表示有 T T T 组数据。
  接下来输入 T T T 组数据,每组数据包含两行:第一行一个整数 N N N,表示数组 A A A 的长度;第二行输入 N N N 个整数从左至右依次为 A 0 , A 1 , ⋯   , A N − 1 A_0, A_1, \cdots, A_{N−1} A0,A1,,AN1,相邻元素之间用空格分隔。

【输出格式】

  对于每组数据,输出一行,包含一个整数表示答案,答案可能会很大,你需要将答案对 1000000007 1000000007 1000000007 进行取模后输出。

【样例输入】

2
2
6 6
2
1 6

【样例输出】

4
0

【样例说明】

  对于第一组数据,答案为 4 4 4。(注意:大括号内的数字表示元素在数组中的下标。)
   R 1 = { 0 } , R 2 = { 1 } R_1 = \{0\}, R_2 = \{1\} R1={ 0},R2={ 1};此时 S 1 = A 0 = 6 S_1 = A_0 = 6 S1=A0=6 为偶数, S 2 = A 1 = 6 S_2 = A_1 = 6 S2=A1=6 为偶数。
   R 1 = { 1 } , R 2 = { 0 } R_1 = \{1\}, R_2 = \{0\} R1={ 1},R2={ 0};此时 S 1 = A 1 = 6 S_1 = A_1 = 6 S1=A1=6 为偶数, S 2 = A 0 = 6 S_2 = A_0 = 6 S2=A0=6 为偶数。
   R 1 = { 0 , 1 } , R 2 = { } R_1 = \{0,1\}, R_2 = \{\} R1={ 0,1},R2={ };此时 S 1 = A 0 + A 1 = 12 S_1 = A_0 + A_1 = 12 S1=A0+A1=12 为偶数, S 2 = 0 S_2 = 0 S2=0 为偶数。
   R 1 = { } , R 2 = { 0 , 1 } R_1 = \{\}, R_2 = \{0, 1\} R1={ },R2={ 0,1};此时 S 1 = 0 S_1 = 0 S1=0 为偶数, S 2 = A 0 + A 1 = 12 S_2 = A_0 + A_1 = 12 S2=A0+A1=12 为偶数。
  对于第二组数据,无论怎么选择,都不满足条件,所以答案为 0 0 0

【评测用例规模与约定】

  对于 20 % 20\% 20% 的评测用例, 1 ≤ N ≤ 10 1 ≤ N ≤ 10 1N10
  对于 40 % 40\% 40% 的评测用例, 1 ≤ N ≤ 1 0 2 1 ≤ N ≤ 10^2 1N102
  对于 100 % 100\% 100% 的评测用例, 1 ≤ T ≤ 10 , 1 ≤ N ≤ 1 0 3 , 0 ≤ A i ≤ 1 0 9 1 ≤ T ≤ 10, 1 ≤ N ≤ 10^3, 0 ≤ A_i ≤ 10^9 1T10,1N103,0Ai109


以为是个动规,但实际上可以找规律,设 f i , o d d f_{i,odd} fi,odd { 0 , 1 , ⋯   , i } \{0,1,\cdots ,i\} { 0,1,,i}取出若干使 R R R为奇数的方案数, f i , e v e n f_{i,even} f

### 第十四届蓝桥杯大赛 Java 研究生详情 #### 比概述 第十四届蓝桥杯全国软件和信息技术专业人才大赛旨在推动软件开发技术的发展,培养大学生的创新思维和实践能力。该事面向全国高校在校学生开放,分为多个竞类别和技术方向。 #### 参对象 比主要针对计算机科学及相关专业的研究生群体。参者需具备扎实的编程基础以及解决实际问题的能力。 #### 制安排 - **报名阶段**:通常提前几个月启动,在线注册并提交个人信息完成报名流程。 - **初级选拔)**:采用在线答题形式,考察选手的基础理论知识与算法设计水平。题目难度适中,覆盖广泛的知识点,包括但不限于数据结构、算法分析等[^1]。 ```java // 示例代码展示如何处理数求和问题 public class ArraySum { public static int sumRange(int[] array, int L, int R) { int sum = 0; for (int i = L; i <= R && i < array.length; i++) { sum += array[i]; } return sum; } public static void main(String[] args) { int[] A = {1, 2, 3, 4, 5}; System.out.println(sumRange(A, 1, 3)); // 输出9 } } ``` - **决准备**:晋级选手将进入更深入的技术挑战环节,可能涉及复杂的数据结构操作、高级算法应用等内容。 - **总决**:线下举行,邀请各区优秀代表参与终极对决,争夺全国奖项。 #### 奖项设置 根据成绩排名颁发不同等级的荣誉证书及奖品,鼓励更多年轻人投身于科技创新领域。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值