Acwing---877. 扩展欧几里得算法

news2025/1/23 11:26:03

扩展欧几里得算法

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

给定 n n n 对正整数 a i ai ai, b i bi bi,对于每对数,求出一组 x i xi xi, y i yi yi,使其满足 a i × x i + b i × y i = g c d ( a i , b i ) ai×xi+bi×yi=gcd(ai,bi) ai×xi+bi×yi=gcd(ai,bi)

输入格式
第一行包含整数 n n n

接下来 n n n 行,每行包含两个整数 a i ai ai, b i bi bi

输出格式
输出共 n n n 行,对于每组 a i ai ai, b i bi bi,求出一组满足条件的 x i xi xi, y i yi yi,每组结果占一行。

本题答案不唯一,输出任意满足条件的 x i xi xi, y i yi yi 均可。

数据范围
1 ≤ n ≤ 1 0 5 , 1≤n≤10^5, 1n105,

1 ≤ a i , b i ≤ 2 × 1 0 9 1≤ai,bi≤2×10^9 1ai,bi2×109

输入样例:

2
4 6
8 18

输出样例:

-1 1
-2 1

2.基本思想

欧几里得算法

  • 欧几里得算法(gcd)又称辗转相除法,是求最大公约数的一种方法。
  • 代码实现:
public static long gcd(long m, long n) {//时间复杂度:O(log n)
        return n == 0 ? m : gcd(n, m % n);
    }
  • lcm算法
    两个整数的最小公倍数与最大公因数之间有如下的关系:
    在这里插入图片描述

  • 代码实现:

public static long lcm(long a, long b) {
        return a * b / gcd(a, b);
    }

裴蜀(贝祖)等式

  • 对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式)
    ax+by=m有整数解时当且仅当m是d的倍数。
    裴蜀等式有解时必然有无穷多个整数解,每组解x、y都称为裴蜀数,可用扩展欧几里得算法(Extended Euclidean algorithm)求得。
  • 方程12x+42y=6有解
  • 特别地,方程 ax+by=1有整数解当且仅当整数a和b互素

扩展欧几里得算法
扩展欧几里得算法就是在求a,b的最大公约数d=gcd(a,b)的同时,求出贝祖等式ax+by=m的一个解(x0,y0)
如何递推?

x=y1
y=x1 - a / b * y1
通解:
x = x0 +(b / gcd )* t       所有的x对b同模
y = y0 -( a / gcd )* t       所有的y对a同模

如果想要得到×大于0的第一个解?

b /= d;x =(x0 % b + b )% b


gcd(a,b)
return b==0?a
我们观察到:欧几里德算法停止的状态是: a’= gcd , b’ = 0 ,(a’,b’是递归最后一层时参数的值)那么,这是否能给我们求解 x y 提供一种思路呢?
a’x + b’y = gcd 此时x=1,y为任意数
因为,这时候,只要 a = gcd 的系数是 1 ,那么只要 b 的系数是 0 或者其他值
(无所谓是多少,反正任何数乘以 0 都等于 0 但是a 的系数一定要是 1),这时,我们就会有: a’*1 + b’*0 = gcd

当然这是最终状态,但是我们是否可以从最终状态反推到最初的状态呢?

假设当前我们要处理的是求出 a 和 b的最大公约数,并求出 x 和 y 使得
 a*x + b*y= gcd    ……(1),--->要求的
而我们已经求出了下一个状态:b 和 a%b 的最大公约数,并且求出了一组x1 和y1 使得:
 b*x1 + (a%b)*y1 = gcd (2) ,-->下一个状态
那么这两个相邻的状态之间是否存在一种关系呢?

a%b = k  ==>  a = b*(a/b) +k  "/"舍掉余数的除法 ==> k=a-(a/b)*b
我们知道: a%b = a - (a/b)*b(这里的 “/” 指的是整除,例如 5/2=2 , 1/3=0),那么,我们可以进一步得到:

    gcd = b*x1 + (a-(a/b)*b)*y1

        = b*x1 + a*y1 – (a/b)*b*y1

        = a*y1 + b*(x1 – a/b*y1)        ……(3)

对比之前我们的状态,式(3)和式(1):求一组 x 和 y 使得:a*x + b*y = gcd ,是否发现了什么?

这里:

    x = y1

    y = x1 – a/b*y1

这就是递推式,注意x,y是递归过程中的上一层,x1,y1是下一层(下一个状态)得到的值

3.代码实现

import java.util.Scanner;

public class Main {
    static int x, y;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        while (n-- > 0) {
            int a = sc.nextInt(), b = sc.nextInt();
            exgcd(a, b);
            System.out.println(x + " " + y);
        }
    }

    private static int exgcd(int a, int b) {
        if (b == 0) {//到达递归边界开始向上一层返回
            x = 1;
            y = 0;
            return a;
        }
        int d = exgcd(b, a % b);//保存最大公约数
        int x1 = x;//备份x1
        x = y;
        y = x1 - a / b * y;
        return d;
    }
}

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

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

相关文章

Diffusion Model——扩散模型

Diffusion Model 文章目录 Diffusion ModelDenoising Diffusion Probabilistic Model(DDPM)去噪过程:Denoise结构训练过程Text-to-image Generation Model High Resolution Image Synthesis With_Latent Diffusion Models (Stable Diffusion)基本结构与推理过程Text…

基于scrapy框架的单机爬虫与分布式爬虫

我们知道,对于scrapy框架来说,不仅可以单机构建复杂的爬虫项目,还可以通过简单的修改,将单机版爬虫改为分布式的,大大提高爬取效率。下面我就以一个简单的爬虫案例,介绍一下如何构建一个单机版的爬虫&#…

WGS-84坐标系、东北天坐标系、载体坐标系

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、WGS-84坐标系二、东北天坐标系(ENU)1、站心直角坐标系2、站心极坐标系 三、载体坐标系总结 前言 作为一名智驾HIL工程师&#xff0…

My desktop didn‘t come with the Bluetooth.

You didnt turn on the Bluetooth on PC and phone.Turn on it to control your phone. My desktop didnt come with the Bluetooth. 电脑控制手机的时候,电脑蓝牙没打开 电脑蓝牙打开步骤 电脑蓝牙的小图标打开了 手机上可以看到计算机了【Thinkpad-T440p-zwf】 无…

Studio One 6.5下载安装激活图文教程

Studio One 6.5是由PreSonus公司打造一款功能强大的数字音乐创作软件,不仅为用户们提供了制作、混合、掌握和执行所有操作,还提供了简洁直观的主界面,因此使用起来也是十分的简单,就算是初学者也可以快速的上手使用起来&#xff0…

[计算机网络]---Http协议

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习&#xf…

云手机在引流方面有什么优势?

对于电商商家而言,无论是在亚马逊还是其他平台,有效的流量来源主要集中在短视频引流和社交电商营销。要在新兴社交平台为企业电商带来更多流量,不可忽视云手机的关键作用和独特优势。 云手机的定义与作用 在经营TikTok、Facebook和INS账号时&…

linux中的文件操作

linux的理念 在linux中的一切皆为文件!!! 在上一篇博客中提到过,Linux中的桌面本质上也是一种文件,而现在,在本篇博客中要对这种理念进行进一步的提升,也就是在Linux系统中的一切皆为文件&#…

多线程---创建线程

1.概述 多线程是指从软件或者硬件上实现多个线程并发执行的技术。线程是程序中独立运行的程序片段,每个线程都有独立的执行流程,可以在同一时间内执行不同的任务。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提…

Swift 5.9 新 @Observable 对象在 SwiftUI 使用中的陷阱与解决

概览 在 Swift 5.9 中,苹果为我们带来了全新的可观察框架 Observation,它是观察者开发模式在 Swift 中的一个全新实现。 除了自身本领过硬以外,Observation 框架和 SwiftUI 搭配起来也能相得益彰,事倍功半。不过 Observable 对象…

SPSSAU【文本分析】|我的词库

我的词库 文本分析时,可能涉及到一些新词,比如‘内卷’,这个词很可能在词典中并未出现过,词库也不认识它。但研究者自己认识它,此时可将该词纳入到新词词库中,让系统统计词频等信息时也对该词进行统计。当…

【牛客面试必刷TOP101】Day23.BM27 按之字形顺序打印二叉树和BM30 二叉搜索树与双向链表

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…

公众号答题活动怎么做_答题大闯关,赢取丰厚奖品

【智慧挑战】答题大闯关,赢取丰厚奖品,你准备好了吗? 在这个信息爆炸的时代,知识就是力量,智慧就是财富。你是否想展现自己的聪明才智,挑战自己的知识极限?今天,我们特别策划了一场…

git分布式版本控制工具基本操作

Windows操作 1.1 git基本操作 1.设置用户签名 git config user.name xx git config user.email xxb163.com2.初始化本地库 git init3.查看本地库状态 git status4.添加暂存区 git add 文件名称 git add *5.提交本地库 git commit -m "描述信息" 文件6.查看版本…

代码随想录算法训练营29期|day53 任务以及具体安排

第九章 动态规划part10 121. 买卖股票的最佳时机 // 解法1 class Solution {public int maxProfit(int[] prices) {if (prices null || prices.length 0) return 0;int length prices.length;// dp[i][0]代表第i天持有股票的最大收益// dp[i][1]代表第i天不持有股票的最大收…

【Linux网络】网络编程套接字(预备知识+UDP)

目录 预备知识 1. 理解源IP地址和目的IP地址 2. 理解源MAC地址和目的MAC地址 3. 认识端口号 4. 理解源端口号和目的端口号 5. 端口号(port) vs 进程pid 6. 认识TCP协议和认识UDP协议 7. 网络字节序 socket编程接口 1. socket 常见API 2. sock…

C++ STL详解:map

目录 一、map的使用 1.1map模板参数 1.2map的构造函数及迭代器 1.3map的容量与元素访问 1.4map中的增删查改 二、日常实操 一、map的使用 CSTL详解:set 通过对set的简单了解,我们可以知道,set就类似于二叉搜索树的key模型,…

黑马程序员-瑞吉外卖-day8

目录 菜品新增 菜品代码准备: 1.entity 2.mapper 3.service 4.sevice目录下的impl目录 5.controller 菜品口味代码准备: 1.entity 2.mapper 3.service 4.sevice目录下的impl目录 菜品新增 分析: 后台系统中可以管理菜品信息&…

医用软管用双轴测径仪 外径与椭圆度的双重检测!

摘要:软管的一大特点就是容易产生形变,接触式测量稍施压力可能导致测量不准,因此非接触式的高精高速测径仪被广泛的应用于生产中。 关键词:双轴测径仪,医用软管测径仪,软管测径仪,测径仪,软管外径测量仪 引言 非接触式的外径测量仪…

【监控】spring actuator源码速读

目录 1.前言 2.先搂一眼EndPoint 3.EndPoint如何被注入 4.EndPoint如何被暴露 4.1.如何通过http暴露 4.2.如何通过jmx暴露 5.EndPoint是怎么实现监控能力的 6.知道这些的意义是什么 1.前言 版本:spring-boot-starter-actuator 2.6.3 阅读源码一定要带着疑…