第十三届蓝桥杯大赛软件赛决赛(Java 大学C组)

本文探讨了斐波那契数列的应用问题(第111-202202011200202202011200202202011200项中个位为7的项数)、实验数据的质数统计、取模操作的理论与实践、内存空间计算、斐波那契数组的理解、最大公约数算法、交通信号系统的优化、灯光布局的解谜、购物策略的经济分析,以及宝石收集游戏中路径优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


试题 A: 斐波那契与 7

本题总分: 5 5 5


【问题描述】

  斐波那契数列的递推公式为 : : F n = F n − 1 + F n − 2 F_n = F_{n−1} + F_{n−2} Fn=Fn1+Fn2,其中 F 1 = F 2 = 1 F_1 = F_2 = 1 F1=F2=1

  请问,斐波那契数列的第 1 1 1 202202011200 202202011200 202202011200 项(含)中,有多少项的个位是 7 7 7

【答案提交】

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


26960268160


找循环节


  找到斐波那契数列在个位上的循环节,然后将答案拆分成三部分就完事了。

import java.util.HashMap;
import java.util.Map;

public class Test {
   

	public static void main(String[] args) {
    new Test().run(); }
	
	long N = 202202011200L;
	
	void run() {
   
		Map<Integer, Integer> map = new HashMap();
		int[] cnt = new int[100];
		map.put(01, 1);
		int i, j, F1 = 0, F2 = 1, F3 = 0;
		for (i = 2; ; ++i) {
   
			F3 = (F1 + F2) % 10;
			cnt[i] = cnt[i - 1];
			if (F3 == 7) ++cnt[i];
			if (map.containsKey(F2 * 10 + F3)) break;
			map.put(F2 * 10 + F3, i);
			F1 = F2;
			F2 = F3;
		}
		j = map.get(F2 * 10 + F3);
		System.out.print(
			cnt[j - 1] +
			((N - j + 1) / (i - j)) * (cnt[i] - cnt[j]) +
			cnt[(int)(N % (i - j)) - j + 1]
			);
	}
}

试题 B: 小蓝做实验

本题总分: 5 5 5


【问题描述】

  小蓝很喜欢科研,他最近做了一个实验得到了一批实验数据,一共是两百万个正整数。如果按照预期,所有的实验数据 x x x 都应该满足 1 0 7 ≤ x ≤ 1 0 8 10^7 ≤ x ≤ 10^8 107x108。但是做实验都会有一些误差,会导致出现一些预期外的数据,这种误差数据 y y y 的范围是 1 0 3 ≤ y ≤ 1 0 12 10^3 ≤ y ≤ 10^{12} 103y1012 。由于小蓝做实验很可靠,所以他所有的实验数据中 99.99 % 99.99\% 99.99% 以上都是符合预期的。小蓝的所有实验数据都在 p r i m e s . t x t \mathrm{primes.txt} primes.txt 中,现 在他想统计这两百万个正整数中有多少个是质数,你能告诉他吗?

【答案提交】

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


342693


欧拉筛


  首先排除 M i l l e r \mathrm{Miller} Miller- R o b i n \mathrm{Robin} Robin,一般 T T T 次询问的题目, T T T 越大,对单次询问响应的复杂度要求越高,于是考虑欧拉筛线性筛出不大于 1 e 8 1e8 1e8 的质数, O ( 1 ) O(1) O(1) 响应 99.99 % 99.99\% 99.99% 的询问,而剩下询问中, y y y 不会大于 1 e 16 1e16 1e16,利用因数的对称性,可以在 O ( y ) O(\sqrt y) O(y ) 的复杂下响应。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;

public class Test {
   

	public static void main(String[] args) {
    new Test().run(); }
	
	int i, N = (int)1e8, M = 0, cnt = 0;
	
	void run() {
   
		boolean[] composite = new boolean[N + 1];
		int[] prime = new int[(int)(1.1 * N / Math.log(N))];
		for (int n = 2; n <= N; ++n) {
   
			if (!composite[n]) 
				prime[M++] = n;
			for (int i = 0; i < M; ++i) {
   
				if (prime[i] * n > N) break;
				composite[prime[i] * n] = true;
				if (n % prime[i] == 0) break;
			}
		}
		try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("primes.txt")))) {
   
			while (true) {
   
				String line = in.readLine();
				if (line == null) break;
				long n = Long.parseLong(line);
				if (n > 1e8) {
   
					for (i = 0; prime[i] <= 1e6; ++i)
						if (n % prime[i] == 0) break;
					if (prime[i] > 1e6) ++ cnt;
				} else if (!composite[(int)n]) ++cnt;
			}
		} catch (Exception e) {
   
			e.printStackTrace();
		}
		System.out.print(cnt);
	}
}

试题 C: 取模

时间限制: 3.0 s 3.0\mathrm s 3.0s 内存限制: 512.0 M B 512.0\mathrm{MB} 512.0MB 本题总分: 10 10 10


【问题描述】

  给定 n , m n,m n,m,问是否存在两个不同的数 x , y x,y x,y 使得 1 ≤ x < y ≤ m 1 ≤ x < y≤m 1x<ym n mod ⁡ x = n mod ⁡ y n \operatorname{mod} x = n \operatorname{mod} y nmodx=nmody

【输入格式】

  输入包含多组独立的询问。

  第一行包含一个整数 T T T 表示询问的组数。

  接下来 T T T 行每行包含两个整数 n , m n,m n,m,用一个空格分隔,表示一组询问。

【输出格式】

  输出 T T T 行,每行依次对应一组询问的结果。如果存在,输出单词 Y e s \mathrm{Yes} Yes;如果不存在,输出单词 N o \mathrm{No} No

【样例输入】

3
1 2
5 2
999 99

【样例输出】

No
No
Yes

【评测用例规模与约定】

  对于 20 % 20\% 20% 的评测用例, T ≤ 100 , n , m ≤ 1000 T ≤100 ,n,m≤1000 T100n,m1000
  对于 50 % 50\% 50% 的评测用例, T ≤ 10000 , n , m ≤ 1 0 5 T ≤10000 ,n,m≤10^5 T10000n,m105
  对于所有评测用例, 1 ≤ T ≤ 1 0 5 , 1 ≤ n ≤ 1 0 9 , 2 ≤ m ≤ 1 0 9 1≤T ≤10^5 ,1≤n≤10^9 ,2≤m≤10^9 1T1051n1092m109


中国剩余定理


  假定 n ≥ m n \geq m nm,转换命题为,给定两个整数 n , m n,m n,m n ≥ 1 , m ≥ 2 n \geq 1,m \geq 2 n1,m2,问 k = 1 , 2 , ⋯   , m k = 1, 2, \cdots,m k=1,2,,m n mod ⁡ k n \operatorname{mod} k nmodk 是否恰取遍 [ 0 , m − 1 ] [0, m-1] [0,m1]

  更近一步引出等价命题, n mod ⁡ k ≡ k − 1 n \operatorname{mod} k \equiv k-1 nmodkk1 是否在 k ∈ [ 1 , m ) k \in [1,m) k[1,m) 下都成立,因为 n mod ⁡ 1 ≡ 0 n \operatorname{mod} 1 \equiv 0 nmod10 n mod ⁡ 2 n \operatorname{mod} 2 nmod2 若想使上述命题为真,只能取 1 1 1,以此类推。

  于是有同余方程组,当 n n n 满足下列方程组时,无论如何也找不到两个不同的数 x , y x,y x,y 使得 1 ≤ x < y ≤ m 1 ≤ x < y≤m 1x<ym n mod ⁡ x = n mod ⁡ y n \operatorname{mod} x = n \operatorname{mod} y nmodx=nmody { n ≡ 1 ( m o d 2 ) n ≡ 2 ( m o d 3 )   ⋮ ⋮ n ≡ m − 1 ( m o d m ) \begin{cases} n \equiv 1 & \pmod 2 \\ n \equiv 2 & \pmod 3 \\ \quad\ \vdots & \qquad \vdots\\ n \equiv m-1 & \pmod m \end{cases}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值