大家好,我是snippet,今天是刷蓝桥真题的第十五天,我们的刷题旅途也已经达到一半了,在这过程中我们也学到了很多知识,今天的题四可以用ST表或者线段树来解决,我的题解写的是用ST表来解决的,下面是我今天的题解
题目链接:斐波那契与7 - 蓝桥云课 (lanqiao.cn)
题目内容:
问题描述
斐波那契数列的递推公式为: Fn=Fn−1+Fn−2, 其中 F1=F2=1 。
请问, 斐波那契数列的第 1 至 202202011200 项(含)中, 有多少项的个位是 7 。
答案提交
这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
解题思路:
直接暴力求区间[1,202202011200]里面的数据的数字的个位数为7的数字的个数
代码:
package 蓝桥杯31天真题冲刺.Day15;
import java.io.*;
/**
* @author snippet
* @data 2023-03-18
* 斐波那契与7-蓝桥云课
*/
public class T1_斐波那契与7 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static long ans = 0;
public static void main(String[] args) throws IOException {
// long f1 = 1;
// long f2 = 1;
// for (long i = 3; i <= 202202011200L; i++) {
// long t = (f1+f2)%10;
// f1 = f2;
// f2 = t;
// if (t == 7) ans++;
// }
// pw.println(ans);
pw.println("26960268160");
pw.flush();
br.close();
}
}
题目链接:小蓝做实验 - 蓝桥云课 (lanqiao.cn)
题目内容:
问题描述
小蓝很喜欢科研, 他最近做了一个实验得到了一批实验数据, 一共是两百 万个正整数。
如果按照预期, 所有的实验数据 x 都应该满足 10^7≤x≤10^8 。
但是做实验都会有一些误差, 会导致出现一些预期外的数据, 这种误差数据 y 的 范围是 10^3≤y≤10^12 。由于小蓝做实验很可靠, 所以他所有的实验数据中 99.99% 以上都是符合预期的。
小蓝的所有实验数据都在 primes.txt 中, 现 在他想统计这两百万个正整数中有多少个是质数, 你能告诉他吗?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
解题思路:
文件读入,用BigInteger的isProbablePrime()来判断素数,isProbablePrime()中的参数的值给的越大,误差就越小,可满足正确值达到99.99%
代码:
package 蓝桥杯31天真题冲刺.Day15;
import java.io.*;
import java.math.BigInteger;
/**
* @author snippet
* @data 2023-03-18
* 小蓝做实验-蓝桥云课
*/
// 文件读入 BigInteger的isProbablePrime
public class T2_小蓝做实验 {
static String filePath = "C:\\Users\\hxw\\Desktop\\primes.txt";
static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static int ans = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filePath))));
String s = "";
while ((s = br.readLine()) != null) {
BigInteger n = new BigInteger(s);
if (n.isProbablePrime(10)) ans++;
}
pw.println(ans);
pw.println(342693);
pw.flush();
br.close();
}
}
题目链接:质因数个数 - 蓝桥云课 (lanqiao.cn)
题目内容:
问题描述
给定正整数 n, 请问有多少个质数是 n 的约数。
输入格式
输入的第一行包含一个整数 n 。
输出格式
输出一个整数, 表示 n 的质数约数个数。
样例输入
396
样例输出
3
样例说明
396 有 2,3,112,3,11 三个质数约数。
评测用例规模与约定
对于 30% 的评测用例, 1≤n≤10000 。
对于 60% 的评测用例, 1≤n≤10^9 。
对于所有评测用例, 1≤n≤10^16 。
运行限制
- 最大运行时间:10s
- 最大运行内存: 512M
解题思路:
这个题考查分解质因数,我们用一个集合set来存给定数字的所有质因数,输出其长度就可以了
代码:
package 蓝桥杯31天真题冲刺.Day15;
import java.io.*;
import java.util.HashSet;
import java.util.Set;
/**
* @author snippet
* @data 2023-03-18
* 质因数个数-蓝桥云课
*/
// 分解质因数
public class T3_质因数个数 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static long n;// n表示给定的数字大小
static Set set = new HashSet<>();// set存n的所有质因数
public static void main(String[] args) throws IOException {
String[] s = br.readLine().split(" ");
n = Long.parseLong(s[0]);
Long t = 2L;
while (t * t <= n) {
while (n % t == 0) {
set.add(t);
n /= t;
}
t++;
}
if (n > 1) set.add(n);
pw.println(set.size());
pw.flush();
br.close();
}
}
题目链接:最大公约数 - 蓝桥云课 (lanqiao.cn)
题目内容:
问题描述
给定一个数组, 每次操作可以选择数组中任意两个相邻的元素 x,y 并将其中的一个元素替换为 gcd(x,y), 其中 gcd(x,y) 表示 x 和 y 的最大公约数。 请问最少需要多少次操作才能让整个数组只含 1 。
输入格式
输入的第一行包含一个整数 n, 表示数组长度。
第二行包含 n 个整数 a1,a2,⋯,an, 相邻两个整数之间用一个空格分隔。
输出格式
输出一行包含一个整数, 表示最少操作次数。如果无论怎么操作都无法满足要求, 输出 −1 。
样例输入
3
4 6 9
样例输出
4
评测用例规模与约定
对于 30% 的评测用例, n≤500,ai≤1000;
对于 50% 的评测用例, n≤5000,ai≤10^6;
对于所有评测用例, 1≤n≤100000,1≤ai≤10^9 。
运行限制
- 最大运行时间:3s
- 最大运行内存: 512M
解题思路:
这个题是在区间中找符合条件的值,我们可以使用ST表来对数据进行区间查询,因为是判断能不能用最小操作数来将这个区间的所有数变成1,操作方式为可将x,y的任意一个数变成gcd(x,y),
根据分析一共有3种情况:
1.给定数据中含1,那操作数就是n - 数据中含有1的个数;
2.创建ST表对数据进行处理后,区间[1,n]中没有含有1的数,输出-1表示无法操作
3.原来数据没有1,对数据进行处理之后数组里面含有1,因为是最小操作数,那我们要找到最短的含有gcd为1的子区间我们可以考虑二分。对于数组中的每个数我们都可以固定为左端点l ,然后去二分它的右端点,求出使得区间[l,r]的gcd为1的最小的右端点,因为找到右端点之后满足的区间都是往右边走,如果往右端点的左边走可能就不包含gcd为1的数了,所以我们就给定left来二分right
这个题可以参考执梗大佬的题解:第十三届蓝桥杯Java、C++、Python组国赛真题——最大公约数(三语言AC)_蓝桥杯最大公约数_执 梗的博客-CSDN博客
代码:
package 蓝桥杯31天真题冲刺.Day15;
import java.io.*;
/**
* @author snippet
* @data 2023-03-18
* 最大公约数-蓝桥云课
*/
// ST表
public class T4_最大公约数 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static int n,ans = 0;
static int N = 200010;
static int[][] f = new int[N][25];
static int[] Log2 = new int[N];
static int[] a = new int[N];
static void rmq_init() {
// 预处理Log2数组
for (int i = 2; i <= n; i++) {
Log2[i] = Log2[i / 2] + 1;
}
for (int i = 1; i <= n; i++) {
f[i][0] = a[i];
}
for (int j = 1; (1< 0) {
pw.println(n - cnt);
pw.flush();
return;
}
rmq_init();
if (rmq_query(1, n) != 1) {
pw.println(-1);
pw.flush();
return;
}
ans = n;
for (int i = 1; i <= n; i++) {
int left = i + 1, right = n + 1;
while (left < right) {
int mid = left + right >> 1;
if (rmq_query(i, mid) == 1) right = mid;
else left = mid + 1;
}
if (rmq_query(i, right) == 1) ans = Math.min(ans, right - i);
}
pw.println(n - 1 + ans);
pw.flush();
br.close();
}
}