蓝桥杯31天真题冲刺|题解报告|第十五天

大家好,我是snippet,今天是刷蓝桥真题的第十五天,我们的刷题旅途也已经达到一半了,在这过程中我们也学到了很多知识,今天的题四可以用ST表或者线段树来解决,我的题解写的是用ST表来解决的,下面是我今天的题解 

一、斐波那契与7

题目链接:斐波那契与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();
    }
}

你可能感兴趣的:(2023年蓝桥杯31天真题冲刺,蓝桥杯,算法,java)