A、美丽的 2
本题总分:5 分
问题描述
小蓝特别喜欢 2 ,今年是公元 2020 年,他特别高兴。
他很好奇,在公元 1 年到公元 2020 年(包含)中,有多少个年份的数位中包含数字 2 ?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
package action; public class demo { public static void main(String[] args) { int sum = 0; for (int i = 0; i < 2021; i++) { int t = i; while (t > 0) { if (t % 10 == 2) { sum++; break; } t = t / 10; } } System.out.println(sum); } }
B、合数个数
本题总分:5 分
问题描述
一个数如果除了 1 和自己还有其他约数,则称为一个合数。例如:1,2,3 不是合数,4,6 是合数。请问从 1 到 2020 一共有多少个合数。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
package action; public class demo { public static void main(String[] args) { int sum = 0; for (int i = 1; i < 2021; i++) { for (int j = 2; j * j <= i; j++) { if (i % j == 0) { sum++; // System.out.print(i+" "); break; } } } System.out.println(sum); } }
C、扩散
本题总分:10 分
问题描述
小蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。
小蓝在画布上首先点了一下几个点:(0,0),(2020,11),(11,14),(2000,2000)。只有这几个格子上有黑色,其它位置都是白色的。
每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。
请问,经过 2020 分钟后,画布上有多少个格子是黑色的。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
package action; public class demo { public static void main(String[] args) { int sum = 0; for (int x = -2020; x <= 2020 + 2020; x++) { for (int y = -2020; y <= 2000 + 2020; y++) { if (check(x, y)) { sum++; } } } System.out.println(sum); } private static boolean check(int x, int y) { if (Math.abs(x - 0) + Math.abs(y - 0) <= 2020) { return true; } if (Math.abs(x - 2020) + Math.abs(y - 11) <= 2020) { return true; } if (Math.abs(x - 11) + Math.abs(y - 14) <= 2020) { return true; } if (Math.abs(x - 2000) + Math.abs(y - 2000) <= 2020) { return true; } return false; } }
D、阶乘约数
本题总分:10 分
问题描述
定义阶乘 n!=1×2×3×⋅⋅⋅×n。
请问 100! (100 的阶乘)有多少个约数。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
package action; import java.util.ArrayList; public class demo { public static void main(String[] args) { int sum = 0; ArrayList<Integer> a = new ArrayList<Integer>(); int b[] = new int[100]; for (int i = 2; i < 100; i++) { if (is(i)) { a.add(i); } } for (int i = 2; i <= 100; i++) { int t = i; for (;;) { for (int p : a) { if (t % p == 0) { b[p] += 1; t = t / p; break; } } if (t == 1) { break; } } } long l = 1; for (int i = 0; i < b.length; i++) { if (b[i] != 0) { l = l * (b[i] + 1); } } System.out.println(l); } private static boolean is(int x) { int t = 0; for (int i = 2; i < x; i++) { if (x % i == 0) { t = 1; } } if (t == 1) { return false; } else { return true; } } }
E、本质上升序列
本题总分:15 分
问题描述
小蓝特别喜欢单调递增的事物。
在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。
例如,在字符串 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。
请问对于以下字符串(共 200 个小写英文字母,分四行显示):(如果你把以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 inc.txt,内容与下面的文本相同)
tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij
gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl
本质不同的递增子序列有多少个?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
package action; public class demo { static int dp[][] = new int[201][27]; public static void main(String[] args) { String str = "tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl"; for (int i = 1; i <= str.length(); i++) { for (int j = 0; j < 26; j++) { dp[i][j] = dp[i - 1][j]; if (str.charAt(i - 1) == 'a' + j) { dp[i][j] = 1; for (int k = 0; k < j; k++) { dp[i][j] += dp[i - 1][k]; } } } } int ans = 0; for (int j = 0; j < 26; j++) { ans += dp[str.length()][j]; } System.out.print(ans); } }