博客
关于我
蓝桥杯AcWing学习笔记 8-1数论的学习(上)
阅读量:796 次
发布时间:2023-03-25

本文共 3167 字,大约阅读时间需要 10 分钟。

蓝桥杯数论

数论是蓝桥杯中非常重要的一个知识点,涉及到许多经典的算法和定理。本文将介绍几个常见的数论题目和相关的解题思路。


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

欧几里得算法是数论中最基本的算法之一,其原理是通过不断地用较大的数除以较小的数,直到余数为零时,较小的数就是这两个数的最大公约数(GCD)。这一算法的核心思想是通过递归的方式不断更新除数和被除数,最终找到两个数的最大公约数。

代码示例:

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;    }}

2. 算术基本定理

算术基本定理(也称为因式分解定理)是数论的基础之一。它指出,每一个正整数都可以唯一地分解成若干个质数的乘积。具体来说,任何正整数 ( N ) 都可以表示为:[ N = P_1^{α_1} \times P_2^{α_2} \times \cdots \times P_k^{α_k} ]其中,( P_i ) 是质数,( α_i ) 是对应的指数。


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

线性筛法是一种高效的算法,用于在 ( O(N) ) 时间复杂度内找出 ( 1 ) 到 ( N ) 之间的所有质数,以及每个数的最小质因子。其核心思想是通过筛选的方式,标记出所有的合数,并记录下每个合数的最小质因子。

代码示例:

public class Main {    static final int N = 1000010;    static int[] primes = new int[N];    static int cnt;    static boolean[] st = new boolean[N];    public static void main(String[] args) {        get_primes(100000);        for (int i = 0; i < 20; i++) {            System.out.println(primes[i]);        }    }    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++) {                    st[primes[j] * i] = true;                    if (i % primes[j] == 0) break;                }            }        }    }}

4. 题意分析——数论应用

在某些题目中,我们需要根据给定的数 ( X ) 分解质因数,并找到满足特定条件的数列。例如,我们需要找出所有满足以下条件的严格单调递增的数列:

  • 每一项都是前一项的倍数(且倍数大于1)。
  • 这些数列的最大长度以及满足条件的数列个数。

质因数分解与问题解决:通过算术基本定理,我们可以知道 ( X ) 的质因数分解结果为:[ X = P_1^{α_1} \times P_2^{α_2} \times \cdots \times P_k^{α_k} ]每一次倍数的增加都必须是质因数的组合,这样可以保证数列的严格递增性。

排列数公式:如果 ( X ) 的质因数分解结果为 ( α_1 + α_2 + \cdots + α_k ),那么满足条件的数列个数可以通过多重集合的排列数公式计算:[ \frac{(α_1 + α_2 + \cdots + α_k)!}{α_1! \times α_2! \times \cdots \times α_k!} ]


5. 真题解析——最大公约数

在某些真题中,我们需要计算一组数的最大公约数(GCD)。例如,在等差数列中,除了第一项,其余每一项与第一项的差的最大公约数即为数列公差的最大值。

项数公式:给定等差数列的首项 ( a ) 和末项 ( a_{\text{末}} ),公差 ( d ),则数列的项数 ( t ) 为:[ t = \frac{a_{\text{末}} - a}{d} + 1 ]

最大公约数(GCD):通过欧几里得算法,可以快速计算出一组数的最大公约数。


6. 辗转相减法

辗转相减法是一种求最大公约数的另一种方法,其核心思想是通过不断地减去较小的数的倍数,直到其中一个数变为零,从而找到两个数的最大公约数。


7. 蓝桥杯真题解析

C++B组第8题——最大公约数题目要求我们在等差数列中,找到除了第一项以外,其余每一项与第一项的差的最大公约数。通过欧几里得算法,我们可以高效地解决这个问题。

时间复杂度: ( O(N \log N) )

代码示例:

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;    }}

8. 蓝桥杯真题——等比数列的比值

在某些题目中,我们需要通过选出部分等比数列的数字,推断出原等比数列的比值的最大可能值。通过质因数分解和算术基本定理,我们可以找到满足条件的最优解。


总之,数论是蓝桥杯中非常重要的一部分,涉及到许多经典的算法和定理。通过对这些知识点的深入理解和实践,我们可以在比赛中取得优异的成绩。

转载地址:http://rkhfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现ItemCF算法(附完整源码)
查看>>
Objective-C实现iterating through submasks遍历子掩码算法(附完整源码)
查看>>
Objective-C实现jaccard similarity相似度无平方因子数算法(附完整源码)
查看>>
Objective-C实现Julia集算法(附完整源码)
查看>>
Objective-C实现k nearest neighbours k最近邻分类算法(附完整源码)
查看>>
Objective-C实现k-Means算法(附完整源码)
查看>>
Objective-C实现k-nearest算法(附完整源码)
查看>>
Objective-C实现Knapsack problem背包问题算法(附完整源码)
查看>>
Objective-C实现knapsack背包问题算法(附完整源码)
查看>>
Objective-C实现knapsack背包问题算法(附完整源码)
查看>>
Objective-C实现knight tour骑士之旅算法(附完整源码)
查看>>
Objective-C实现KNN算法(附完整源码)
查看>>
Objective-C实现koch snowflake科赫雪花算法(附完整源码)
查看>>
Objective-C实现KPCA(附完整源码)
查看>>
Objective-C实现kth order statistick阶统计量算法(附完整源码)
查看>>
Objective-C实现LRU 缓存算法(附完整源码)
查看>>
Objective-C实现lstm prediction预测算法(附完整源码)
查看>>
Objective-C实现max subarray sum最大子数组和算法(附完整源码)
查看>>
Objective-C实现MaximumSubarray最大子阵列(动态规划解决方案)算法(附完整源码)
查看>>
Objective-C实现max_heap最大堆算法(附完整源码)
查看>>