第十二届蓝桥杯 2021年省赛真题 (C/C++ 大学B组) 第二场


解析移步对应 Java组 的题解


#A 求余

本题总分: 5 5 5


问题描述

  在 C / C \mathrm{C/C} C/C++ / J a v a / P y t h o n \mathrm{/Java/Python} /Java/Python 等语言中,使用 % \% % 表示求余,请问 2021 % 20 2021\%20 2021%20 的值是多少?


答案提交

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


1


  粪题。


#B 双阶乘

本题总分: 5 5 5


问题描述

  一个正整数的双阶乘,表示不超过这个正整数且与它有相同奇偶性的所有正整数乘积。 n n n 的双阶乘用 n ! ! n!! n!! 表示。
  例如:
   3 ! ! = 3 × 1 = 3 3!! = 3 × 1 = 3 3!!=3×1=3
   8 ! ! = 8 × 6 × 4 × 2 = 384 8!! = 8 × 6 × 4 × 2 = 384 8!!=8×6×4×2=384
   11 ! ! = 11 × 9 × 7 × 5 × 3 × 1 = 10395 11!! = 11 × 9 × 7 × 5 × 3 × 1 = 10395 11!!=11×9×7×5×3×1=10395
  请问, 2021 ! ! 2021!! 2021!! 的最后 5 5 5 位(这里指十进制位)是多少?
  注意: 2021 ! ! = 2021 × 2019 × ⋅ ⋅ ⋅ × 5 × 3 × 1 2021!! = 2021 × 2019 × · · · × 5 × 3 × 1 2021!!=2021×2019××5×3×1
  提示:建议使用计算机编程解决问题。


答案提交

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


59375


#include <stdio.h>

int ans = 1, n = 2021, p = 100000;

int main() {
   
    while (n > 0)
        ans = ans * n % p, n -= 2;
    printf("%05d", ans);
}

  粪。


#C 格点

本题总分: 10 10 10


问题描述

  如果一个点 ( x , y ) (x, y) (x,y) 的两维坐标都是整数,即 x ∈ Z x ∈ Z xZ y ∈ Z y ∈ Z yZ,则称这个点为一个格点。
  如果一个点 ( x , y ) (x, y) (x,y) 的两维坐标都是正数,即 x > 0 x > 0 x>0 y > 0 y > 0 y>0,则称这个点在第一象限。
  请问在第一象限的格点中,有多少个点 ( x , y ) (x, y) (x,y) 的两维坐标乘积不超过 2021 2021 2021,即 x ⋅ y ≤ 2021 x · y ≤ 2021 xy2021
  提示:建议使用计算机编程解决问题。


答案提交

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


15698


朴素解法


#include <stdio.h>

int ans = 0, n = 2021;

int main() {
   
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            if (i * j <= n) ans++;
    printf("%d", ans);
}

倍数法


  这道题与统计不大于 2021 2021 2021 的自然数中的每个数的因数个数等价。

  因为对于任意不同的自然数 n = x × y n = x × y n=x×y,生成其的二元组 ( x , y ) (x,y) (x,y) 互相独立,于是问题等价于上述命题。

  这时我们选用倍数法去统计因数个数之和,即可在 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的复杂度下计算出答案,这是因为不大于 n n n 的自然数的因数个数之和约等于 n log ⁡ n n \log n nlogn 个,而倍数法对于每个因数只统计一次。

#include <stdio.h>

int ans = 0, n = 2021;

int main() {
   
    for (int i = 1; i <= n; i++)
        for (int j = 1; i * j <= n; j++) ans++;
    printf("%d", ans);
}

#D 整数分解

本题总分: 10 10 10


问题描述

  将 3 3 3 分解成两个正整数的和,有两种分解方法,分别是 3 = 1 + 2 3 = 1 + 2 3=1+2 3 = 2 + 1 3 = 2 + 1 3=2+1。注意顺序不同算不同的方法。
  将 5 5 5 分解成三个正整数的和,有 6 6 6 种分解方法,它们是 1 + 1 + 3 = 1 + 2 + 2 = 1 + 3 + 1 = 2 + 1 + 2 = 2 + 2 + 1 = 3 + 1 + 1 1+1+3 = 1+2+2 = 1 + 3 + 1 = 2 + 1 + 2 = 2 + 2 + 1 = 3 + 1 + 1 1+1+3=1+2+2=1+3+1=2+1+2=2+2+1=3+1+1
  请问,将 2021 2021 2021 分解成五个正整数的和,有多少种分解方法?


答案提交

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


691677274345


归纳法


  对于 n n n n ∈ Z + n \in \mathbb{Z^+} nZ+,设 n n n 划分 n ′ n' n 个的方案数为 f n , n ′ f_{n,n'} fn,n

  划分为 1 1 1 个正整数的方案为一,即 n n n

  划分为 2 2 2 个正整数的方案,有 n − 1 n - 1 n1 种,即 { n − k , k } \{n-k,k\} { nk,k} k ∈ Z + k \in \mathbb{Z^+} kZ+ n ≥ 2 n \geq 2 n2

  划分为 3 3 3 个正整数的方案,有 ( n − 1 ) ( n − 2 ) 2 \cfrac{(n-1)(n-2)}{2} 2(n1)(n2) 种,即 ∑ i = 2 n − 1 ( f i , 2 × f n − i , 1 ) = ∑ i = 2 n − 1 ( i − 1 ) \displaystyle\sum_{i = 2}^{n-1} (f_{i,2} ×f_{n-i,1}) = \displaystyle\sum_{i = 2}^{n-1} (i - 1) i=2n1(fi,2×fni,1)=i=2n1(i1) n ≥ 3 n \geq 3 n3

  划分为 5 5 5 个正整数的方案,有 ∑ i = 3 n − 2 ( f i , 3 × f n − i , 2 ) = ∑ i = 3 n − 2 ( i − 1 ) ( i − 2 ) ( n − i −

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值