蓝桥杯 2021年省赛真题 (C/C++ 大学A组 )
解析移步对应 Java组 的题解。
上课摸的鱼。
有无 J A \mathrm{JA} JA 的题单,有点难找。
#A 双阶乘
本题总分: 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);
}
粪。
#B 格点
本题总分: 5 5 5 分
问题描述
如果一个点 ( x , y ) (x, y) (x,y) 的两维坐标都是整数,即 x ∈ Z x ∈ Z x∈Z 且 y ∈ Z y ∈ Z y∈Z,则称这个点为一个格点。
如果一个点 ( 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 x⋅y≤2021。
提示:建议使用计算机编程解决问题。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
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);
}
#C 整数分解
本题总分: 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^+} n∈Z+,设 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 n−1 种,即 { n − k , k } \{n-k,k\} { n−k,k}, k ∈ Z + k \in \mathbb{Z^+} k∈Z+, n ≥ 2 n \geq 2 n≥2;
划分为 3 3 3 个正整数的方案,有 ( n − 1 ) ( n − 2 ) 2 \cfrac{(n-1)(n-2)}{2} 2(n−1)(n−2) 种,即 ∑ 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=2∑n−1(fi,2×fn−i,1)=i=2∑n−1(i−1), n ≥ 3 n \geq 3 n≥3;
划分为 5 5 5 个正整数的方案,有 ∑ i = 3 n − 2 ( f i , 3 × f n − i , 2 ) = ∑ i = 3 n − 2 ( i − 1 ) ( i − 2 ) ( n − i − 1 ) 2 = n 2 ∑ i = 3 n − 2 { ( i − 1 ) ( i − 2 ) } − 1 2 ∑ i = 3 n − 2 { ( i 2 − 1 ) ( i − 2 ) } = n 2 ( ( n − 3 ) ( n − 4 ) ( 2 n − 7 ) 6 + ( n + 1 ) ( n − 4 ) 2 − 2 ( n − 4 ) ) − 1 2 ( ( ( n − 2 ) ( n − 3 ) 2 ) 2 + ( n − 1 ) ( n − 2 ) ( 2 n − 3 ) 6 − ( 2 n − 1 ) ( n − 4 ) − 6 ) \displaystyle\sum_{i = 3}^{n-2} (f_{i,3} ×f_{n-i,2}) = \displaystyle\sum_{i=3}^{n-2} \cfrac{(i-1)(i-2)(n-i-1)}{2} = \frac n2\displaystyle\sum_{i=3}^{n-2}\{(i-1)(i-2)\} - \frac12\displaystyle\sum_{i=3}^{n-2}\{(i^2-1)(i-2)\} = \frac n2\left(\cfrac{(n-3)(n-4)(2n-7)}{6} + \cfrac{(n+1)(n-4)}{2} - 2(n-4)\right) - \frac 12\left((\cfrac{(n-2)(n-3)}2)^2+\cfrac{(n-1)(n-2)(2n-3)}{6}-(2n - 1)(n-4)-6\right) i=3∑n−2(fi,3×fn−i,2)=i=3∑n−22(i−1)(i−2)(n−i−1)=2ni=3∑n−2{ (i−1)(i−2)}−21