总体来说,4个小时写10道题,实在有点搞不赢。
以前都是6道,为啥今年突然就10道了啊,时间也不多给点,难搞。
希望时间多给点。
目录
试题 A: 美丽的 2
本题总分:5 分
- 【问题描述】
小蓝特别喜欢 2,今年是公元 2020 年,他特别高兴。
他很好奇,在公元 1 年到公元 2020 年(包含)中,有多少个年份的数位中包含数字 2?
- 【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:563
代码:
// 试题 A: 美丽的 2
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// long n = sc.nextLong();
int count = 0;
for (int i = 1; i <= 2020; ++i) {
if (2 == i / 1 % 10 || 2 == i / 10 % 10 || 2 == i / 100 % 10
|| 2 == i / 1000 % 10) {
System.out.println(i);
++count;
}else{
// System.out.println(i);
}
}
System.out.println(count);
System.out.println();
}
}
试题 B: 扩散
本题总分:5 分
- 【问题描述】
小蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。
小蓝在画布上首先点了一下几个点:(0, 0), (2020, 11), (11, 14), (2000, 2000)。
只有这几个格子上有黑色,其它位置都是白色的。
每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。
请问,经过 2020 分钟后,画布上有多少个格子是黑色的。
- 【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:20392908
代码:
// 试题 B: 扩散
// 这个就是一道模拟题。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// long n = sc.nextLong();
int n = 4000 + 2000 + 4000;
boolean[][][] arr = new boolean[2][n][n];
arr[0][4000 + 0][4000 + 0] = true;
arr[0][4000 + 2020][4000 + 11] = true;
arr[0][4000 + 11][4000 + 14] = true;
arr[0][4000 + 2020][4000 + 2020] = true;
int to = 0;
for (int k = 0; k < 2020; ++k) {
int from = k % 2;
to = (k + 1) % 2;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (arr[from][i][j]) {
arr[to][i][j] = true;
arr[to][i - 1][j] = true;
arr[to][i][j - 1] = true;
arr[to][i + 1][j] = true;
arr[to][i][j + 1] = true;
}
}
}
}
int count = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (arr[to][i][j]) {
++count;
}
}
}
System.out.println(count);
}
}
试题 C: 阶乘约数
本题总分:10 分
- 【问题描述】
定义阶乘 n! = 1 × 2 × 3 × · · · × n。
请问 100! (100 的阶乘)有多少个约数。
- 【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:39001250856960000
代码:
// 试题 C: 阶乘约数
// 找到 100! 的所有因子。所有(因子的个数+1)相乘。
import java.util.*;
public class Main {
static boolean is_prime(int n) {
if (2 == n)
return true;
for (int i = 2, end = (int) Math.ceil(Math.sqrt(n)); i <= end; ++i) {
if (0 == n % i) {
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// long n = sc.nextLong();
int arr[] = new int[100 + 1];
ArrayList<Integer> primes = new ArrayList<Integer>();
for (int j = 2; j < 100; ++j) {
if (is_prime(j)) {
primes.add(j);
}
}
System.out.println(primes.toString());
for (int k = 2; k <= 100; ++k) {
int kk = k;
for (;;) {
for (int p : primes) {
if (0 == kk % p) {
++arr[p];
kk = kk / p;
break;
}
}
if (1 == kk)
break;
}
}
long count = 1;
for (int j = 2; j <= 100; ++j) {
if (0 != arr[j]) {
System.out.printf("%d:%d\n", j, arr[j]);
count *= (arr[j] + 1);
}
}
System.out.println(count);
}
}
试题 D: 本质上升序列
本题总分:10 分
- 【问题描述】
小蓝特别喜欢单调递增的事物。
在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。
例如,在字符串 lanqiao 中,如果取出字符 n 和 q,则 nq 组成一个单调递增子序列。类似的单调递增子序列还有 lnq、i、ano 等等。
小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第二个字符和最后一个字符可以取到 ao,取最后两个字符也可以取到 ao。小蓝认为他们并没有本质不同。
对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个?
例如,对于字符串 lanqiao,本质不同的递增子序列有 21 个。它们分别是 l、a、n、q、i、o、ln、an、lq、aq、nq、ai、lo、ao、no、io、lnq、anq、lno、ano、aio。
请