蓝桥杯AcWing学习笔记 8-1数论的学习(上)

蓝桥杯

我的AcWing

题目及图片来自蓝桥杯C++ AB组辅导课

数论(上)

蓝桥杯省赛中考的数论不是很多,这里讲几个蓝桥杯常考的知识点。

欧几里得算法——辗转相除法

image-20220304182558152

欧几里得算法代码:

import java.util.Scanner ;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt(), b = sc.nextInt();
        System.out.println(gcd(a, b));
    }

    private static int gcd(int a, int b) {
        return b != 0 ? gcd(b, a % b) : a;
    }
}

算术基本定理

就是因式分解的定理,所有的整数都可以唯一分解成若干个质因子乘积的形式:

N = P 1 α 1 × P 2 α 2 × . . . × P k α k N=P_{1}^{α_{1}}×P_{2}^{α_{2}}×...×P_{k}^{α_{k}} N=P1α1×P2α2×...×Pkαk,其中 P i P_{i} Pi 是质数,每一个 α i ≥ 0 α_{i} \geq0 αi0

image-20220304195609211

筛法求素数——线性筛法(欧拉筛法)

O ( N ) O(N) O(N)的时间复杂度内,求出来1 ~ n中所有的质数,以及每一个数的最小质因子。

import java.util.Scanner ;

public class Main {

    static final int N = 1000010;
    static int[] primes = new int[N]; // 存所有的质数
    static int cnt; // 存质数的个数
    static boolean[] st = new boolean[N]; // 当前数有没有被筛过 0没有被筛过 1表示筛过

    public static void main(String[] args) {
        get_primes(100000);
        
        for (int i = 0; i < 20; i++) System.out.println(primes[i]); // 输出100000的前20个质数
    }

    private static void get_primes(int n) {
        for (int i = 2; i <= n; i++) {
            if (!st[i]) primes[cnt++] = i;
            for (int j = 0; primes[j] * i <= n; j++) {
                /*
                  因为prime中素数是递增的,所以如果i%prime[j]!=0代表i的最小质因数还没有找到,
                  即i的最小质因数大于prime[j]
                  也就是说prime[j]就是i*prime[j]的最小质因数,于是i*prime[j]被它的最小质因数筛掉了
                */
                st[primes[j] * i] = true; // 把质数的i倍筛掉
                /*
                  如果当i%prime[j]==0时,代表i的最小质因数是prime[j],
                  那么i*prime[j+k](k>0)这个合数的最小质因数就不是prime[j+k]而是prime[j]了
                  所以i*prime[j+k]应该被prime[j]筛掉,而不是后续的prime[j+k],于是在此时break
                */
                if (i % primes[j] == 0) break; // 通过最小质因子来筛
            }
        }
    }
}

注释中的两段解释参考博客 线性筛(欧拉筛)——算法解析

① 筛掉的一定是合数,且一定是用其最小质因子筛的

② 合数一定会被筛掉

image-20220305185612283

这样我们就可以把所有质数找出来,而且每个和数只会被最小质因子筛,所以每个和数只会被筛一次,所以整个算法的时间复杂度为 O ( N ) O(N) O(N)

例题

AcWing 1295. X的因子链

算术基本定理

线性筛法

题意有点绕,通俗来讲就是给我们任意一个正整数 X X X,我们可以求一下 X X X所有的约数: d 1 , d 2 . . . d k d_{1},d_{2}...d_{k} d1,d2...dk,然后我们要从中挑出来一些严格单调递增的数,使得每一项都是它前一项的倍数: a 1 < a 2 < . . . < a t a_{1}<a_{2}<...<a_{t} a1<a2<...<at ( a i ∣ a i + 1 ) (a_{i}|a_{i+1}) (aiai+1),然后问我们可以挑出来的序列的最大长度是多少,以及有多少个满足条件的单调递增的序列?

每一项必然满足: a i + 1 = a i ⋅ P ( P 是倍数且 > 1 ) a_{i+1} = a_{i}·P(P是倍数 且>1) ai+1=aiP(P是倍数且>1),每一个后一项都等于前一项乘上一个倍数,那么我们要想让整个序列最长的话,要尽可能让倍数最小,最小只能小到质数,因为小到质数就不能再分了,因此就可以用我们上边的算术基本定理了,假设 X X X分解质因数的结果: X = P 1 α 1 × P 2 α 2 × . . . × P k α k X=P_{1}^{α_{1}}×P_{2}^{α_{2}}×...×P_{k}^{α_{k}} X=P1α1×P2α2×...×Pkαk,我们可以发现一共有 α 1 + α 2 + . . . + α k α_{1}+α_{2}+...+α_{k} α1+α2+...+αk 个质因子,因此我们每一次后一项要比前一项至少要多一个倍数,每一次的倍数必然是一个质数,必然是在 X X X当中的某一个质因子,所以序列的最大长度就是 α 1 + α 2 + . . . + α k α_{1}+α_{2}+...+α_{k} α1+α2+...+αk

那么如何求这样序列的个数呢?先做一个映射,我们不存数的本身,我们存数的增量,原序列是 a 1 , a 2 . . . a t a_{1},a_{2}...a_{t} a1,a2...at,映射的序列是: a 1 a_{1} a1, a 2 a 1 a_{2}\over a_{1} a1a2, a 3 a 2 a_{3}\over a_{2} a2a3 . . . ... ... a t a t − 1 a_{t}\over a_{t-1} at1at,这两个序列是一一对应的,给我们第一个序列就可以求第二个序列,在第二个序列中每一个数都是 X X X的质因子,因此序列个数就是 X X X所有质因子的排列数。

image-20220305145729674

排列数公式: ( α 1 + α 2 + . . . + α k ) ! α 1 ! ⋅ α 2 ! ⋅ . . . ⋅ α k ! (α_{1}+α_{2}+...+α_{k})! \over α_{1}!·α_{2}!·...·α_{k}! α1!α2!...αk!(α1+α2+...+αk)!,也被称为多重集合的排列数问题,这样就避免了重复情况。

我们分解质因数就用线性筛法来解。

import java.util.Scanner ;

public class Main {

    static final int N = (1 << 20) + 10;
    static int[] primes = new int[N]; // 存所有的质数
    static int cnt; // 存质数的个数
    static int[] minp = new int[N]; // 存最小质因子
    static boolean[] st = new boolean[N]; // 当前数有没有被筛过

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        get_primes(N - 1);

        int[] fact = new int[30]; // 记录因子
        int[] sum = new int[N]; // 存因子个数

        while (sc.hasNext()) {
            int x = sc.nextInt();
            int k = 0, total = 0;
            while (x > 1) {
                int p = minp[x];
                fact[k] = p;
                sum[k] = 0;
                while (x % p == 0) { // 分解质因数
                    x /= p;
                    sum[k]++;
                    total++;
                }
                k++;
            }

            long res = 1;
            for (int i = 1; i <= total; i++) res *= i; // 求total的阶乘
            for (int i = 0; i < k; i++) { // 多重集合的排列数
                for (int j = 1; j <= sum[i]; j++) {
                    res /= j;
                }
            }

            System.out.println(total + " " + res);
        }
    }

    private static void get_primes(int n) {
        for (int i = 2; i <= n; i++) {
            if (!st[i]) {
                minp[i] = i; // 因为i是质数 最小质因子就是它本身
                primes[cnt++] = i;
            }
            for (int j = 0; primes[j] * i <= n; j++) {
                int t = primes[j] * i;
                st[t] = true;
                minp[t] = primes[j];
                st[primes[j] * i] = true;
                if (i % primes[j] == 0) break;
            }
        }
    }
}

第十届2019年蓝桥杯真题

AcWing 1246. 等差数列

C++B组第8题

最大公约数

欧几里得算法

在等差数列中,每一项与第一项的差一定是公差d的倍数,但是题中的等差数列有一部分未连续,所以我们要找到除了第一项,其余的每一项和第一项的差的最大公约数dd就是整个数列公差的最大值。

image-20220304185548071

求项数公式: a 末 − a 首 d a_{末}-a_{首} \over d daa + 1 + 1 +1

时间复杂度 O ( N l o g N ) O(NlogN) O(NlogN)

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    
    static final int N = 100010;
    static int[] a = new int[N];
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) a[i] = sc.nextInt();
        Arrays.sort(a, 0, n);
        
        int d = 0;
        for (int i = 1; i < n; i++) d = gcd(d, a[i] - a[0]); // 求最大公约数
        
        if (d == 0) System.out.print(n); // 表示所有项都相同
        else System.out.print((a[n - 1] - a[0]) / d + 1); // 求项数公式
    }

    private static int gcd(int a, int b) {
        return b != 0 ? gcd(b, a % b) : a;
    }
}

第七届2016年蓝桥杯真题

AcWing 1223. 最大比例

C++B组第10题

最大公约数

辗转相减法

M M M个奖金构成了一个等比数列,奖金是正整数,但是比值有可能是分数;从这些等比数列挑出一部分数字,通过选出来的这些数来推断原来等比数列的比值的最大可能值是多少。

image-20220307182650365

这题太难了,没肝动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/318601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序基础学习(js混编)

在组件中使用外部js代码实现数据改变 先创建js文件 编写一些组件代码 编写外部js代码 在组件的js中引入外部js 在 app.json中添加路径规则 组件代码 <!--components/my-behavior/my-behavior.wxml--> <view><view>当前计数为{{count}}</view> <v…

Redis主从复制、哨兵及集群

目录 简介 主从复制 哨兵 集群 1.Redis 主从复制 主从复制的作用 主从工作原理 主从复制搭建 安装redis 修改redis配置文件Master节点操作 修改 Redis 配置文件slave节点操作 验证主从效果 2.Redis 哨兵模式 哨兵模式的作用 哨兵结构组成部分 故障转移机制 主…

Android 13.0 SystemUI下拉状态栏定制二 锁屏页面横竖屏时钟都居中功能实现一

1.前言 在13.0的系统rom定制化开发中,在关于systemui的锁屏页面功能定制中,由于在平板横屏锁屏功能中,时钟显示的很大,并且是在左旁边居中显示的, 由于需要和竖屏显示一样,所以就需要用到小时钟显示,然后同样需要居中,所以就来分析下相关的源码,来实现具体的功能 2.S…

图解智慧:数据可视化如何助你高效洞悉信息?

在信息爆炸的时代&#xff0c;数据扮演着越来越重要的角色&#xff0c;而数据可视化则成为解读和理解海量数据的得力工具。那么&#xff0c;数据可视化是如何帮助我们高效了解数据的呢&#xff1f;下面我就以可视化从业者的角度来简单聊聊这个话题。 无需深奥的专业知识&#x…

leetcode 每日一题 2024年01月14日 删除排序链表中的重复元素

题目 83. 删除排序链表中的重复元素 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff…

mac 上 ssh: connect to host localhost port 22: Connection refused

1。 问题 在搭建hadoop环境的时候 发现ssh localhost 在报错 2. 解决 打开系统设置 -> 共享 -> -> 在左边服务中选择 远程登录 注意红框这些选项慎重选择&#xff01;&#xff01;&#xff01; 修改后&#xff0c;在终端再次 ssh localhost 发现登录成功了 如果…

2024美赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

PEFT(高效微调)方法一览

PEFT论文解读2019-2023 2019-Adapter Tuning2019-PALs2020-Adapter-Fusion2021-Adapter-Drop2021-Diff-Pruning2021-Prefix-Tuning2021-Prompt-Tuning2021-WARP2021-LoRA2021-P-Tuning2021-P-Tuning-V22022-BitFit2022-MAM-Adpater2022-UniPELT2023-AdaLoRA总结 本文旨在梳理20…

RWKV入门

主要参考资料 B站视频《【项目原作解读】RWKV Foundation侯皓文&#xff1a;新型RNN模型RWKV&#xff0c;结合Transformer的并行化训练优势和RNN的高效推理》 RWKV官网: https://www.rwkv.com/ 目录 前言RWKV由来模型架构关键结果劣势未来展望 前言 RNN无法并行化&#xff0c;…

AES加解密模式

要想学习AES&#xff0c;首先要清楚三个基本的概念&#xff1a;密钥、填充、模式。 1、密钥 密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称&#xff0c;是因为这类算法对明文的加密和解密需要使用同一个密钥。 AES支持三种长度的密钥&#xff1a; 128位&#xff…

html5基础入门

html5基础语法与标签 前言前端开发零基础入门介绍前端开发行业介绍&#xff1a;大前端时代&#xff1a;前端开发主要技术介绍学习方法IDE简介vscode快捷键&#xff1a; 总结 HTML语法与基础标签互联网基本原理HTTP协议&#xff08;请求、响应&#xff09;什么是前端、后端&…

python统计分析——随机抽样(np.random.choice)

参考资料&#xff1a;用python动手学统计学&#xff0c;帮助文档 import numpy as np import pandas as pddata_setnp.array([2,3,4,5,6,7]) np.random.choice(data_set,size2) &#xff08;1&#xff09;a&#xff0c;数据源&#xff0c;用一列数据作为抽样的数据源。 &…

大数据深度学习卷积神经网络CNN:CNN结构、训练与优化一文全解

文章目录 大数据深度学习卷积神经网络CNN&#xff1a;CNN结构、训练与优化一文全解一、引言1.1 背景和重要性1.2 卷积神经网络概述 二、卷积神经网络层介绍2.1 卷积操作卷积核与特征映射卷积核大小多通道卷积 步长与填充步长填充 空洞卷积&#xff08;Dilated Convolution&…

八爪鱼拉拉手

欢迎来到程序小院 八爪鱼拉拉手 玩法&#xff1a;点击鼠标左键拖动移动八爪鱼&#xff0c;当他的手很忙的时候他会很高兴&#xff0c; 不同关卡不同的八爪鱼的位置摆放&#xff0c;快去闯关吧^^。开始游戏https://www.ormcc.com/play/gameStart/248 html <div id"gam…

Gauss消去法(C++)

文章目录 算法描述顺序Gauss消去法列选主元Gauss消去法全选主元Gauss消去法Gauss-Jordan消去法 算法实现顺序Gauss消去法列选主元Gauss消去法全选主元Gauss消去法列选主元Gauss-Jordan消去法 实例分析 Gauss消去法是求解线性方程组较为有效的方法, 它主要包括两个操作, 即消元和…

开源云原生安全的现状

近年来&#xff0c;人们非常重视软件供应链的安全。尤其令人担忧的是开源软件发行版中固有的风险越来越多。这引发了围绕云原生开源安全的大量开发&#xff0c;其形式包括软件物料清单 (SBOM)、旨在验证 OSS 包来源的项目等。 许多组织循环使用大型开源包&#xff0c;但只使用…

NLP技术在搜索推荐场景中的应用

NLP技术在搜索推荐中的应用非常广泛&#xff0c;例如在搜索广告的CTR预估模型中&#xff0c;NLP技术可以从语义角度提取一些对CTR预测有效的信息&#xff1b;在搜索场景中&#xff0c;也经常需要使用NLP技术确定展现的物料与搜索query的相关性&#xff0c;过滤掉相关性较差的物…

设计模式——抽象工厂模式(Abstract Factory Pattern)

概述 抽象工厂模式的基本思想是将一些相关的产品组成一个“产品族”&#xff0c;由同一个工厂统一生产。在工厂方法模式中具体工厂负责生产具体的产品&#xff0c;每一个具体工厂对应一种具体产品&#xff0c;工厂方法具有唯一性&#xff0c;一般情况下&#xff0c;一个具体工厂…

YOLOv5改进 | 二次创新篇 | 结合iRMB和EMA形成全新的iEMA机制(全网独家创新)

一、本文介绍 本文给大家带来的改进机制是二次创新的机制,二次创新是我们发表论文中关键的一环,为什么这么说,从去年的三月份开始对于图像领域的论文发表其实是变难的了,在那之前大家可能搭搭积木的情况下就可以简单的发表一篇论文,但是从去年开始单纯的搭积木其实发表论…

第1课 ROS 系统介绍

1.ROS操作系统介绍 在学习ROS 系统前&#xff0c;我们需要先了解操作系统的定义。操作系统&#xff0c;顾名思义&#xff0c;即提供部分软件和硬件的接口&#xff0c;以供用户直接使用。因此&#xff0c;针对不同的平台、不同的功能&#xff0c;需要采用不同的操作系统来完成底…