蓝桥杯 2023年省赛真题
Java 大学B组
试题 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 g≥9时 n ! ∣ 1 0 9 n!|10^9 n!∣109成立,而当 n ≥ 40 n\geq40 n≥40时 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,⋯,AN−1]。现在小蓝想要从 A A A 对应的数组下标所构成的集合 I = { 0 , 1 , 2 , . . . , N − 1 } I = \{0, 1, 2, . . . , N − 1\} I={ 0,1,2,...,N−1} 中找出一个子集 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=∑r∈R1Ar,S2=∑r∈R2Ar,我们要求 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,⋯,AN−1,相邻元素之间用空格分隔。
【输出格式】
对于每组数据,输出一行,包含一个整数表示答案,答案可能会很大,你需要将答案对 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 1≤N≤10。
对于 40 % 40\% 40% 的评测用例, 1 ≤ N ≤ 1 0 2 1 ≤ N ≤ 10^2 1≤N≤102。
对于 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 1≤T≤10,1≤N≤103,0≤Ai≤109。
以为是个动规,但实际上可以找规律,设 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