首页 > 其他分享 >蓝桥杯之初等数论

蓝桥杯之初等数论

时间:2024-04-09 22:01:23浏览次数:20  
标签:公倍数 gcd 数论 整数 蓝桥 int 最大公约数 解题 初等

在蓝桥杯竞赛中,初等数论部分涉及多个关键知识点。以下是对这些知识点的详细列出、基本概念解释、应用实例以及解题策略和步骤的说明:

1. 质数与合数

基本概念:

质数(素数):大于1的自然数中,只能被1和它本身整除的数。

合数:除了1和它本身以外还有其他因数的自然数。

应用实例:

题目:求给定范围内所有质数的和。

解题策略:使用埃拉托斯特尼筛法或其他筛法找出所有质数,并求和。

2. 约数与倍数

基本概念:

约数:一个整数能被另一个整数整除,则后者是前者的约数。

倍数:一个整数能被另一个整数整除,则前者是后者的倍数。

应用实例:

题目:求一个数的所有正约数之和。

解题策略:遍历从1到该数的所有整数,判断是否为约数,并求和。

3. 最大公约数与最小公倍数

基本概念:

最大公约数(GCD):两个或多个整数共有约数中最大的一个。

最小公倍数(LCM):两个或多个整数公有的倍数中最小的一个。

应用实例:

题目:求两个数的最大公约数和最小公倍数。

解题策略:使用欧几里得算法求最大公约数,然后根据公式LCM(a, b) = |a * b| / GCD(a, b)求最小公倍数。

4. 同余定理

基本概念:

同余:如果两个整数a和b除以同一个正整数m,所得的余数相等,则称a与b对于模m同余。

应用实例:

题目:利用同余定理求解模线性方程。

解题策略:利用同余定理的性质,将问题转化为求解一组线性方程,然后利用线性方程组的求解方法求解。

5. 整数分解与表示

基本概念:

整数分解:将一个合数分解成若干个质因数的乘积。

十进制与其他进制转换:整数在不同进制间的表示和转换。

应用实例:

题目:将一个数分解为质因数乘积的形式。

解题策略:从2开始遍历所有小于等于该数的质数,判断是否为约数,并分解。

6. 模运算与模逆元

基本概念:

模运算:整数除法中的余数运算。

模逆元:在模运算中,若ab ≡ 1 (mod m),则称b是a关于模m的逆元。

应用实例:

题目:利用模逆元求解线性同余方程。

解题策略:首先找到模逆元,然后利用逆元的性质将问题转化为简单的模运算。

7. 欧拉定理与费马小定理

基本概念:

欧拉定理:对于任意与n互质的整数a,有a^φ(n) ≡ 1 (mod n),其中φ(n)是欧拉函数,表示小于n且与n互质的正整数的个数。

费马小定理:如果p是一个质数,a是任意整数,且a不是p的倍数,那么a^(p-1) ≡ 1 (mod p)。

应用实例:

题目:利用欧拉定理或费马小定理求解模幂运算。

解题策略:根据定理的性质,将问题转化为简单的模运算或幂运算。

解题策略和步骤

理解题目:仔细阅读题目,明确题目要求和限制条件。

分析知识点:判断题目所涉及的知识点,并回顾相关概念和定理。

设计算法:根据知识点和题目要求,设计合适的算法或解题步骤。

编码实现:将算法或解题步骤转化为代码,注意代码的正确性和效率。

测试与调试:对代码进行测试和调试,确保能够正确解决问题。

在解题过程中,还需要注意一些常见的优化技巧和策略,如利用数学性质简化问题、避免重复计算、利用数据结构优化算法等。同时,也要注意题目中可能存在的陷阱和特殊情况,确保解题的准确性和完整性。

通过以上的知识点梳理和解题策略介绍,相信能够对蓝桥杯竞赛中初等数论部分的内容有更深入的了解和准备。当然,在实际比赛中还需要结合具体的题目要求和自己的实际情况进行灵活应用和调整。

例子:

问题描述

给定一个正整数n,请编写一个程序来判断n是质数还是合数。

输入

输入一个正整数n。

输出

如果n是质数,输出"Prime";如果n是合数,输出"Composite";如果n小于等于1,输出"Invalid input"(无效输入)。

import java.util.Scanner;

public class PrimeOrComposite {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        
        if (n <= 1) {
            System.out.println("Invalid input");
        } else if (isPrime(n)) {
            System.out.println("Prime");
        } else {
            System.out.println("Composite");
        }
    }
    
    // Function to check if a number is prime
    public static boolean isPrime(int num) {
        if (num <= 1) {
            return false;
        }
        for (int i = 2; i * i <= num; i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
}

蓝桥杯竞赛中经常考察最大公约数(GCD)和最小公倍数(LCM)的算法实现。以下是一个例子,以及如何使用Java语言来实现这两个功能。

例子

假设有两个正整数A和B,我们需要找到它们的最大公约数和最小公倍数。

例如,A = 48, B = 18。

最大公约数(GCD)是6。

最小公倍数(LCM)是144。

public class GCDAndLCM {  
    // 辗转相除法求最大公约数  
    public static int gcd(int a, int b) {  
        if (b == 0) {  
            return a;  
        }  
        return gcd(b, a % b);  
    }  
  
    // 根据最大公约数求最小公倍数  
    public static int lcm(int a, int b) {  
        return a * b / gcd(a, b);  
    }  
  
    public static void main(String[] args) {  
        int A = 48;  
        int B = 18;  
  
        int gcdResult = gcd(A, B);  
        int lcmResult = lcm(A, B);  
  
        System.out.println("最大公约数(GCD)是: " + gcdResult);  
        System.out.println("最小公倍数(LCM)是: " + lcmResult);  
    }  
}

解释:

  1. gcd 方法使用了辗转相除法(也叫欧几里得算法)来求两个数的最大公约数。这是求最大公约数的一种高效方法。
  2. lcm 方法根据两个数的乘积等于它们的最大公约数与最小公倍数的乘积这一性质,通过已知的最大公约数来计算最小公倍数。
  3. main 方法中,我们定义了两个整数A和B,并调用gcd和lcm方法来计算它们的最大公约数和最小公倍数,然后输出结果。
public static int gcd(int a, int b) {  
        if (b == 0) {  
            return a;  
        }  
        return gcd(b, a % b);  
    }  
  
    // 根据最大公约数求最小公倍数  
    public static int lcm(int a, int b) {  
        return a * b / gcd(a, b);  
    }  

这段代码的解释:

这段代码是一个经典的递归函数,用于计算两个整数的最大公约数(Greatest Common Divisor,简称GCD)。这个算法是基于欧几里得算法(Euclidean algorithm),它的基本思想是利用两个整数的相除余数来逐步简化问题,直到余数为0,此时除数就是两数的最大公约数。

具体来说,函数gcd(int a, int b)接受两个整数ab作为参数,并返回它们的最大公约数。

  1. 递归的基本情况if (b == 0)
    这是递归的基本情况。当b为0时,a就是两个数的最大公约数。这是因为在整数除法中,当一个数a除以另一个数b得到余数为0时,b就是a的约数。如果b已经是a的约数,那么它自然也是ab的公约数。由于我们已经尽可能地将b减小到0(这意味着我们已经除去了所有不是ab公约数的数),所以此时的a就是最大公约数。

  2. 递归步骤return gcd(b, a % b);
    这是递归的核心部分。a % b表示a除以b的余数。我们递归地调用gcd函数,但是这次是用ba % b作为参数。这个步骤背后的逻辑是,如果ab有公约数,那么这些公约数也一定是ba % b的公约数。通过不断减小问题的规模(即用更小的数来替代ab),我们最终会到达基本情况,即其中一个数为0,此时另一个数就是最大公约数。

举个例子,假设我们要计算gcd(48, 18)

  • gcd(48, 18) 变成 gcd(18, 12)(因为48 % 18 = 12
  • gcd(18, 12) 变成 gcd(12, 6)(因为18 % 12 = 6
  • gcd(12, 6) 变成 gcd(6, 0)(因为12 % 6 = 0

此时,我们到达了基本情况,所以返回6作为最大公约数。

当然,计算最大公约数的方法不止一种。除了使用递归实现的欧几里得算法之外,还可以使用非递归的方式、迭代法,或者使用更数学化的方法,如更相减损术等。以下是几种不同的实现方式:

1. 非递归的欧几里得算法

public static int gcd(int a, int b) {  
    while (b != 0) {  
        int temp = b;  
        b = a % b;  
        a = temp;  
    }  
    return a;  
}

2. 更相减损术

更相减损术也是中国古代求解最大公约数的一种方法,其基本思想是:任意两个整数a、b,较大数a减去较小数b,得到两数的差c,然后用较大数和差c代替原来的a和b,再用同样的方法操作,直到两数相等为止,则这个数就是所求的最大公约数。

public static int gcd(int a, int b) {  
    // 确保a是较大的数  
    if (a < b) {  
        int temp = a;  
        a = b;  
        b = temp;  
    }  
    // 循环直到两数相等  
    while (a != b) {  
        if (a - b == b) {  
            // 如果a是b的两倍,直接返回b  
            return b;  
        } else if (a - b > b) {  
            // 如果a - b比b大,则用a - b替换a  
            a = a - b;  
        } else {  
            // 否则用b替换a,用a - b替换b  
            b = b - (a - b);  
        }  
    }  
    // 当两数相等时,返回任意一个作为最大公约数  
    return a;  
}

3. 二进制算法

还可以利用二进制运算来高效地计算最大公约数。这种方法基于这样一个事实:任何整数都可以表示成二进制形式。如果两个数a和b某一个对应二进制位上的数字不同,那么这两个数的最大公约数不可能被2整除。反之,如果对应位上的数字相同,那么最大公约数包含因子2的个数与这两个数包含因子2的个数中的较小值相同。

public static int gcd(int a, int b) {  
    // 移除a和b中所有的2的因子  
    while (((a | b) & 1) == 0) {  
        a >>= 1;  
        b >>= 1;  
    }  
    // a和b必然有一个是奇数,此时辗转相除法退化为更相减损术  
    while (b != 0) {  
        // 当b是偶数时  
        if ((b & 1) == 0) {  
            b >>= 1;  
        } else {  
            // 当a是偶数时  
            if ((a & 1) == 0) {  
                a >>= 1;  
            } else {  
                // 当a和b都是奇数时,相当于更相减损术中的a = a - b  
                if (a > b) {  
                    a -= b;  
                } else {  
                    b -= a;  
                }  
            }  
        }  
    }  
    // 最后的非零数就是最大公约数  
    return a;  
}

以上这些方法都可以用来计算两个整数的最大公约数。在实际应用中,可以根据具体需求和性能考虑选择合适的方法。在大多数情况下,欧几里得算法(无论是递归还是非递归版本)都是足够高效且易于实现的。

未完待续......

标签:公倍数,gcd,数论,整数,蓝桥,int,最大公约数,解题,初等
From: https://blog.csdn.net/2301_77523055/article/details/137568462

相关文章

  • 蓝桥杯-外卖店优先级
     代码及其解析#include<bits/stdc++.h>usingnamespacestd;constintN=100010;intorder[N];//order[id]第id号店上一次的订单,记录的是时间intprior[N];//prior[id]第id号店的优先级intflag[N];//flag[id]第id号店在不在优先缓存中structnode{......
  • 蓝桥杯-【二分】求阶乘
     思路:对于有几个0,10一定会是5的整数倍,2的因子数一定比5的多,所以只要算5的个数即可, 30%,每个n都去算#include<bits/stdc++.h>usingnamespacestd;#definelllonglongllcheck(lln){//计算n!末尾有多少个0llcnt=0;while(n)cnt+=......
  • P8625 [蓝桥杯 2015 省 B] 生命之树
    题目:链接:https://www.luogu.com.cn/problem/P8625基本思路:1.使用dp[N]记录i节点的当前最大值2.使用vectornex[N]记录图3.使用vis[N]防回退如果该节点没有子节点,那么这个点的最大值就记录为当前的值:val如果该节点有子节点,那么先遍历子节点,然后+res并记录由于使用了vis,那么......
  • 蓝桥杯历年试题 砝码称重
    看到这个题,自然而然想到用集合set来做,因为set本身就有去重的效果。#include<bits/stdc++.h>usingnamespacestd;intN;intw;set<int>s;intmain(){ cin>>N; for(inti=1;i<=N;i++) { cin>>w; vector<int>v(s.begin(),s.end()); //这里需要用v......
  • 【每周例题】蓝桥杯 C++ 多数
    多数元素题目多数元素思路分析一.第一个想法,暴力遍历,然后会发现容易超时,那么更进一步想:哈希表使用哈希表存储每个数出现的次数,即使用哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数加入后,遍历所有键值对,......
  • 蓝桥杯备考随手记: Java 中常用的排序和查找方法
    1.排序方法Arrays.sort():用于对数组进行排序。它使用优化的快速排序算法来对数组进行排序。示例代码:int[]arr={5,2,8,1,6};Arrays.sort(arr);Collections.sort():用于对集合进行排序。它使用优化的归并排序算法来对集合进行排序。示例代码:List<Integer>list......
  • 蓝桥杯备考随手记: BigInteger 和 BigDecimal
    在Java中,BigInteger和BigDecimal是用来处理大整数和高精度浮点数的类,分别属于java.math包。下面分别介绍这两个类的特点、用途和常用方法:BigInteger:特点:BigInteger类表示任意精度的整数,可以处理比long型和int型更大范围的整数。BigInteger是不可变的(immutable)类,一......
  • P8794 [蓝桥杯 2022 国 A] 环境治理
    P8794[蓝桥杯2022国A]环境治理-洛谷|计算机科学教育新生态(luogu.com.cn)#include<iostream>usingnamespacestd;#definelllonglongconstintN=150;constintinf=0x7fffffff;intn,q;intd[N][N],l[N][N];intt[N][N];voidfloyd(){for(intk=......
  • 蓝桥杯学习日记
    目录方法二分+区间合并搜索与图论全排列n皇后问题走迷宫树的重心图中点的层次有向图的拓扑排序数学知识数论质数:在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者素数质数判定-试除法null质因数:将正整数表示为一连串的质因子相乘分解质因数-试除法筛质数约数约数......
  • 蓝桥杯2014国A-排列序数(待续)
    [蓝桥杯2014国A]排列序数题目描述如果用abcd这\(4\)个字母组成一个串,有\(4!=24\)种,如果把它们排个序,每个串都对应一个序号:abcd0abdc1acbd2acdb3adbc4adcb5bacd6badc7bcad8bcda9bdac10bdca11cabd......