裴蜀定理与欧几里得算法——蓝桥杯真题中的应用

news2024/10/28 5:23:12

目录

  • 裴蜀定理(Bézout's Theorem)
    • 1、定义
    • 2、推论
    • 3、欧几里得算法
    • 4、多个整数的裴蜀定理扩展
  • 真题挑战
    • 解题思路
    • 代码实现与详细注释
    • 代码解析

裴蜀定理(Bézout’s Theorem)

1、定义

对于任意两个整数 ab ,如果它们的最大公约数是 d,那么可以找到整数 xy,使得 ab 的最大公约数 d 可以表示为它们的整数线性组合。
即: gcd(a,b)=ax+by
gcd(a,b)表示a和b的最大公约数。

2、推论

对于两个正整数 ab(且互质,即最大公约数gcd(a,b)为 1),我们可以通过裴蜀定理推导出:无法表示成 ab 的非负整数线性组合的最大数是axb - a - b。换句话说,任何大于 axb - a - b的数都可以用 ab 的非负整数倍表示。

3、欧几里得算法

求两个数的最大公约数,对经典的算法就是欧几里得算法:

public class Main {

    //欧几里得算法
    private static int gcd(int a,int b){
        if(b==0)return a;
        else return gcd(b,a%b);
    }

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

4、多个整数的裴蜀定理扩展

对于多个整数,裴蜀定理仍然适用:

对于一组整数 ( a1, a2, … , an ),如果我们想找到整数 ( x1, x2, …, xn ) 使得:

d = a 1 x 1 + a 2 x 2 + ⋯ + a n x n d = a_1 x_1 + a_2 x_2 + \dots + a_n x_n d=a1x1+a2x2++anxn

其中 d 是这组整数的最大公约数,即 ( d = gcd(a1, a2, …, an) ),那么这样的 ( x1, x2,…, xn ) 一定存在。并且如果d==1那么一定存在数字MAX,a这个集合可以表示仍和大于MAX的数字。并且这个MAX,一定小于原先二元组推导的最大不可表示的数字axb - a- b

真题挑战

第8届蓝桥杯_B组_Java_第七题:包子凑数
在这里插入图片描述

题目要求我们判断给定不同大小的包子笼是否可以凑出某个数量的包子,进而计算出凑不出的包子数量。如果无法凑出无限多种数量的包子,输出INF;否则输出所有无法凑出的数量的个数。

解题思路

  1. 判断是否存在无限个凑不出的情况:通过最大公约数(GCD)判断所有笼子的包子数量是否能组合成任意数量的包子。如果所有笼子的数量的GCD大于1,那么凑不出这个GCD的倍数的数字,这就意味着存在无限多的数量是无法凑出的,输出INF

  2. 动态规划(DP)判断可表示的包子数量:如果笼子的数量的GCD为1,我们可以利用动态规划来记录可凑出的包子数量。用一个布尔数组dp表示不同的包子数量是否可以凑出,其中dp[i]true表示可以凑出i个包子,false表示无法凑出。

  3. 遍历每种蒸笼数量更新dp数组:对每种蒸笼大小A[i],我们更新dp数组,遍历dp数组并设定dp[j + A[i]] = true,表示可以通过加上A[i]来凑出数量j + A[i]

  4. 计算结果:遍历dp数组,统计所有无法凑出的包子数量。

代码实现与详细注释

以下是实现代码,含详细注释。

import java.util.Scanner;

public class Main {
    static int N = 10000; // 设定一个足够大的数组大小,用于记录可凑出的包子数量
    static int n; // 蒸笼的种类数
    static int g; // 所有蒸笼包子数量的最大公约数
    static boolean[] dp = new boolean[N]; // 动态规划数组,dp[i]为true表示可以凑出i个包子
    static int[] arr; // 用于存储每种蒸笼的包子数量

    // 计算两个数的最大公约数(欧几里得算法)
    private static int gcd(int a, int b) {
        if (b == 0) return a;
        return gcd(b, a % b);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt(); // 读取蒸笼种类数
        arr = new int[n]; // 初始化蒸笼包子数量的数组
        dp[0] = true; // 初始状态,0个包子可以表示(即不选择任何蒸笼)

        for (int i = 0; i < n; i++) {
            arr[i] = in.nextInt(); // 读取每种蒸笼的包子数量
            g = gcd(arr[i], g); // 更新所有蒸笼包子数量的最大公约数
            for (int j = 0; j < N - arr[i]; j++) { // 遍历当前dp数组的可凑出数量
                if (dp[j]) dp[j + arr[i]] = true; // 更新dp数组表示可以凑出j + arr[i]个包子
            }
        }

        // 判断是否有无限个无法凑出的数量
        if (g != 1) {
            System.out.print("INF");
            return;
        }

        // 如果g == 1,统计所有无法凑出的包子数量
        long ans = 0; // 用于统计无法凑出的包子数量
        for (boolean is : dp) { // 遍历dp数组
            if (!is) ans++; // 如果dp[i]为false,表示i个包子无法凑出,计数+1
        }
        System.out.print(ans); // 输出无法凑出的包子数量
    }
}

代码解析

  1. 最大公约数的计算:利用欧几里得算法,通过不断递归计算两个数的GCD。如果所有蒸笼的数量的GCD不为1,则有无限多个数量无法凑出,直接输出INF(裴蜀定理)。

  2. 动态规划数组dp的更新:对于每种蒸笼数量A[i],遍历当前dp数组中可凑出的数量j,如果dp[j]true,则可以凑出数量j + A[i]。通过这种方式,我们记录了所有可以凑出的数量。

  3. 结果统计:在确定GCD为1的情况下,遍历dp数组,统计false的项即为无法凑出的数量。

裴蜀定理的应用:本题中利用了裴蜀定理的推论,若GCD为1,可以表示任意大的数,从而限制了无法表示的数量。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Gateway 统一网关

一、初识 Gateway 1. 为什么需要网关 我们所有的服务可以让任何请求访问&#xff0c;但有些业务不是对外公开的&#xff0c;这就需要用网关来统一替我们筛选请求&#xff0c;它就像是房间的一道门&#xff0c;想进入房间就必须经过门。而请求想要访问微服务&#xff0c;就必须…

聚链成网,趣链科技参与 “跨链创新联合体”建设

近日&#xff0c;2024全球数商大会在上海举办。大会由上海数据集团和上海市数商协会联合主办&#xff0c;上海市数据局和浦东新区人民政府支持&#xff0c;以“数联全球&#xff0c;商通未来——‘链’接数字经济新未来”为主题&#xff0c;聚焦区块链技术和应用场景展开。 会上…

Windows生成公钥和私钥

1、打开命令提示符或 PowerShell&#xff1a; 按下 Win R&#xff0c;输入 cmd 或 powershell&#xff0c;然后按 Enter 打开命令提示符或 PowerShell 窗口。 2、生成密钥对&#xff1a; 输入以下命令生成 RSA 密钥对 ssh-keygen -t rsa -b 2048-t rsa 表示生成 RSA 类型的密…

开源模型应用落地-Qwen2-VL-7B-Instruct-vLLM-OpenAI API Client调用

一、前言 学习Qwen2-VL &#xff0c;为我们打开了一扇通往先进人工智能技术的大门。让我们能够深入了解当今最前沿的视觉语言模型的工作原理和强大能力。这不仅拓宽了我们的知识视野&#xff0c;更让我们站在科技发展的潮头&#xff0c;紧跟时代的步伐。 Qwen2-VL 具有卓越的图…

android studio编译错误提示无法下载仓库

一、调整方法之一 buildscript {repositories {google()jcenter()//maven { url https://maven.aliyun.com/repository/google }//maven { url https://maven.aliyun.com/repository/central }}dependencies {// classpath "com.android.tools.build:gradle:4.1.1"c…

Python金色流星雨

系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…

算法的学习笔记—翻转单词顺序列(牛客JZ73)

&#x1f600;前言 在《剑指 Offer》系列题中&#xff0c;有一道关于翻转单词顺序的经典题目。给定一个由多个单词组成的字符串&#xff0c;需要将每个单词的顺序颠倒。这道题考察了对字符串的操作技巧&#xff0c;尤其是如何在限定空间内完成字符串的翻转。本文将详细解析这道…

吉客云与金蝶云星空系统高效数据对接实践

调拨出库红字对接分步式调入(退货)案例分享&#xff1a;吉客云数据集成到金蝶云星空 在企业的日常运营中&#xff0c;数据的高效流转和准确对接是实现业务流程自动化和优化的重要环节。本文将聚焦于一个具体的系统对接集成案例——如何将吉客云的数据无缝集成到金蝶云星空&…

阿里云物联网的通信方式

阿里云物联网通信的两种方式&#xff0c;一个是物模型&#xff08;分为服务&#xff0c;事件&#xff0c;属性&#xff09;&#xff0c;一个是自定义topic&#xff08;要另外设置数据流转&#xff09; 1.使用产品内的功能定义&#xff0c;&#xff08;其实也就是Topic中定义好的…

Prompt Engineering (Prompt工程)

2 prompt工程2大原则 2.1 给出清晰&#xff0c;详细的指令 策略1&#xff1a;使用分割符清晰的指示输出的不同部分&#xff0c;比如"",<>,<\tag>等分隔符 策略2&#xff1a;指定一个结构化的输出&#xff0c;比如json,html等格式 策略3&#xff1a;要…

重学SpringBoot3-Spring WebFlux之SSE服务器发送事件

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ Spring WebFlux之SSE服务器发送事件 1. 什么是 SSE&#xff1f;2. Spring Boot 3 响应式编程与 SSE为什么选择响应式编程实现 SSE&#xff1f; 3. 实现 SSE 的基本步骤3.…

【JavaEE】【多线程】volatile,wait/notify

目录 一、volatile关键字1.1 内存可见性1.2 volatile解决内存可见性问题 二、wait和notify2.1 wait2.2 notify2.3 使用例子2.3.1 例子12.3.2 例子二 一、volatile关键字 volatile可以保证内存可见性&#xff0c;只能修饰变量。 1.1 内存可见性 在前面介绍线程不安全原因时介…

AI编译器与TVM

由于AI芯片的特殊性和高度定制化&#xff0c;为了兼容硬件的多样性&#xff0c;AI模型必须能被高效地映射到各种AI芯片上。AI编译器将深度学习框架描述的AI模型作为输入&#xff0c;将为各种AI芯片生成的优化代码作为输出。AI编译器的目标是通过编译优化的方法将深度学习框架产…

Git的原理和使用(六)

本文主要讲解企业级开发模型 1. 引入 交付软件的流程&#xff1a;开发->测试->发布上线 上面三个过程可以详细划分为一下过程&#xff1a;规划、编码、构建、测试、发 布、部署和维护 最初&#xff0c;程序⽐较简单&#xff0c;⼯作量不⼤&#xff0c;程序员⼀个⼈可以完…

2025 - AI人工智能药物设计 - 中药网络药理学和毒理学的研究

中药网络药理学和毒理学的研究 TCMSP&#xff1a;https://old.tcmsp-e.com/tcmsp.php 然后去pubchem选择&#xff1a;输入Molecule Name 然后进行匹配&#xff1a;得到了smiles 再次通过smiles&#xff1a;COC1C(CC(C2C1OC(CC2O)C3CCCCC3)O)O 然后再次输入&#xff1a;http…

单体架构VS微服务架构

单体架构&#xff1a;一个包含有所有功能的应用程序 优点&#xff1a;架构简单、开发部署简单缺点&#xff1a;复杂性高、业务功能多、部署慢、扩展差、技术升级困难 如上示意图&#xff0c;应用前端页面&#xff0c;后台所有模块功能都放在一个应用程序中&#xff0c;并部署在…

「C/C++」C++标准库之#include<fstream>文件流

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

shodan2---清风

注&#xff1a;本文章源于泷羽SEC&#xff0c;如有侵权请联系我&#xff0c;违规必删 学习请认准泷羽SEC学习视频:https://space.bilibili.com/350329294 实验一&#xff1a;search 存在CVE-2019-0708的网络设备 CVE - 2019 - 0708**漏洞&#xff1a;** 该漏洞存在于远程桌面…

MedSAM微调版,自动生成 Prompt 嵌入实现图像分割!

最近提出的Segment Anything Model (SAM)等基础模型在图像分割任务上取得了显著的成果。 然而&#xff0c;这些模型通常需要通过人工设计的 Prompt &#xff08;如边界框&#xff09;进行用户交互&#xff0c;这限制了它们的部署到下游任务。 将这些模型适应到具有完全 Token 数…

Arduino Uno 同时控制多路舵机

Arduino Uno同时控制4个舵机 舵机可以在0~180度内指定角度的控制。常用于航模、机器人、遥控玩具等物品,然而,很多时候要一次性控制多个舵机,今天以控制4个舵机为例进行说明 接线方式如下图: 舵机的信号线分别接A0,A1,A2,A3。控制舵机从0旋转到180度,再由180度旋转到0度,…