扩展欧几里德问题

我们先来看这个问题

求最大公约数的gcd(m,n)方法也可以如下定义:

如果m%n0,那么gcd(m,n)的值为n.

否则,gcd(m,n)就是gcd(n,m%n)

编写一个递归的方法来求最大公约数。编写一个测试程序,计算gcd(24,16)gcd(255,5)


我们先引入欧几里德的证明

欧几里德证明

gcd(a,b)=gcd(b,a%b)

a=kb+r    r=a%b  r=a-kb

dgcd(a,b)那么可以推出dgcd(b,a%b)


写成代码的形式:

intgcd(int m,int n)
{if(!(m%n))returnn;return gcd(n,m%n);//return m%n==0?n:gcd(n,m%n);//return n?gcd(n,m%n):m;
}

下面我们来看一道简单的题目(poj1061)
青蛙的约会
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 100511 Accepted: 19307

Description

两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。 
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。 

Input

输入只包括一行5个整数x,y,m,n,L,其中x≠y < 2000000000,0 < m、n < 2000000000,0 < L < 2100000000。

Output

输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行"Impossible"

Sample Input

1 2 3 4 5

Sample Output

4

分析题意之后不难得出

a*x+ b*y=gcd


那么我们引入扩展欧几里德的概念

1.扩展欧几里德解的前提

现在我们知道了a 和b 的最大公约数是gcd,那么,我们一定能够找到这样的 x和 y,使得:a*x + b*y = gcd

我们就可以用x0 和y0 表示出整个不定方程的通解:

x= x0 + (b/gcd)*t

y = y0 – (a/gcd)*t


2.扩展欧几里德解的思路:

a*x + b*y= gcd

a*1 + b*0= gcd


3.扩展欧几里德解的证明:

1.a*x+ b*y=gcd

2.b*x1+ (a%b)*y1=gcd

3.a%b= a - (a/b)*b

由此可以得出:

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

写成代码的形式:

long long ex_gcd(long long a,long long b,long long &x,long long &y)
{if(b == 0){x = 1;y = 0;return a;}long long r = ex_gcd(b,a%b,x,y);long long temp = x;x = y;y = temp - a/b*y;return r;
}

完整源代码:

#include <iostream>
#include <stdio.h>
using namespace std;
long long ex_gcd(long long a,long long b,long long &x,long long &y)
{if(b == 0){x = 1;y = 0;return a;}long long r = ex_gcd(b,a%b,x,y);long long temp = x;x = y;y = temp - a/b*y;return r;
}
int main()
{long long x,y,m,n,l,p,q;scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);int r = ex_gcd(n-m,l,p,q);if((x-y)%r)cout<<"Impossible";else{long long d = l/r,dd = (x-y)/r;p *= dd;p = (p%d+d)%d;printf("%lld\n",p);}return 0;
}

附上完整课件资料:http://download.csdn.net/detail/k183000860/9334973







转载于:https://www.cnblogs.com/yefengCrazy/p/5636641.html

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

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

相关文章

步步为营:Asp.Net序列化Json格式的两种方法

过去我们使用JSON.net序列化一个对象&#xff0c;在asp.net3.5中已经集成了序列化对象为json的方法。 我们分别针对System.Runtime.Serialization.Json和System.Web.Script.Serialization两个命名空间下的不同方法进行序列化和反序列化。 System.Runtime.Serialization.Json (在…

[react] react中setState的第二个参数作用是什么呢?

[react] react中setState的第二个参数作用是什么呢&#xff1f; 第二个参数是一个callback函数&#xff0c;用于setState设置state的属性值成功之后的回调&#xff0c;此时调用this.state.property可以取到刚刚设置的最新的值 个人简介 我是歌谣&#xff0c;欢迎和大家一起…

Qt 调用VISA库通过SCPI程控仪器-以IT8906A电子负载为例

SCPI是一种可编程仪器的标准命令&#xff0c;可通过 GPIB&#xff0c; RS232&#xff0c; USB&#xff0c; LAN接口等控制仪器功能的编程语言。 SCPI 置于 IEEE 488.2 硬件部分的顶层。相同 SCPI 命令和参数控制着不同机器的相同功能。一般标准仪器都支持SCPI协议&#xff0c;如…

TCP控制字段标志:URG、ACK、PSH、RST、SYN、FIN

From: http://blog.csdn.net/wangfeng2500/article/details/7650062 在TCP层&#xff0c;有个FLAGS字段&#xff0c;这个字段有以下几个标识&#xff1a;SYN, FIN, ACK, PSH, RST, URG. 其中&#xff0c;对于我们日常的分析有用的就是前面的五个字段。 它们的含义是&#x…

Ubuntu 14.04 ThinkPad E431无线网卡驱动安装

Ubuntu 14.04下安装无线网卡驱动。 sudo apt-get install linux-headers-generic build-essential dkms sudo apt-get install linux-source sudo apt-get install --reinstall bcmwl-kernel-source sudo modprobe wl转载于:https://www.cnblogs.com/shoemaker/p/4800772.ht…

关于如何使用的MSCS(微软群集服务器)中的iSCSI Guest Initiators (客户机启动器)...

发布者&#xff1a;Dell-Terry Z 作者&#xff1a;戴尔公司 William U 嗨&#xff0c;大家好&#xff01;过去的几周实在太激动人心了。第一届戴尔全球存储论坛&#xff08;Dell Storage Forum&#xff09;刚刚结束&#xff0c;我有一大堆的东西想跟大家分享&#xff0c;我想…

openssl版本信息和支持的命令

1、查看openssl版本 openssl version -a openssl version 可以看到版本信息和安装位置: 2、查看openssl支持的命令 openssl help Standard commands asn1parse ca ciphers cms crl crl2pkcs7 dgst …

[react] react中的setState是同步还是异步的呢?为什么state并不一定会同步更新?

[react] react中的setState是同步还是异步的呢&#xff1f;为什么state并不一定会同步更新&#xff1f; 由React控制的事件处理程序&#xff0c;以及生命周期函数调用setState不会同步更新state 。 React控制之外的事件中调用setState是同步更新的。比如原生js绑定的事件&…

还是FreeBSD

原文2005年4月13日写在MSN SPACE上 前几天做的FreeBSD服务器在使用过程中&#xff0c;流量大时会自动断线&#xff0c;提示如下一段话&#xff1a; no memory for rx buffer 一直找不出原因。今天把网卡换了&#xff0c;看明天是否还有错。转载于:https://blog.51cto.com/isgod…

python语法笔记(五)

1、python内存管理 &#xff08;1&#xff09;对象内存使用 &nsbp;&nsbp;&nsbp;&nsbp;在python中通过执行内建函数 id(obj) 可以获得对象obj在内存中的地址。在python中&#xff0c;整数和短小的字符&#xff0c;python都会缓存这些对象&#xff0c;以便重复使…

python实现手机号归属地相关信息查询

根据指定的手机号码&#xff0c;查询其归属地等相关信息&#xff0c;python实现&#xff1a; 手机号文件&#xff1a;test.txt 13693252552 13296629989 13640810839 15755106631 15119622732 13904446048 18874791953 13695658500 13695658547 15950179080 15573462779 15217…

[react] 请说说什么是useReducer?

[react] 请说说什么是useReducer&#xff1f; 基于 redux 思想实现简易数据控制流&#xff0c;useState 基于 reducer 实现 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关…

不被重视的基础,高效地使用ADO.net连接对象

很多初学者朋友在做项目时遇到过这样的问题&#xff0c;那就是在本地调试运行的程序正常&#xff0c;放到服务器上也是正常的&#xff0c;但是如果有了一些并发之后&#xff0c;就会发现页面会出现打不开的现像&#xff0c;其实大多数时候是因为Ado.net链接没有处理完善。当然对…

quick 中实现单例

直接贴代码 local danli nil local classname class("classname") function classname:getInstance() if danli nil then danli classname.new()     end return danli end return classname 使用 local duixiagn classname:getInstance()转载于:https://…

openssl创建CA并签发证书

一、创建私有CA根证书 1、创建CA目录 rootDESKTOP-JP3S3AN:/home/wsl/openssl_pro# mkdir -pv /etc/pki/CA/{private,certs,crl,newcerts} mkdir: created directory /etc/pki/CA mkdir: created directory /etc/pki/CA/private mkdir: created directory /etc/pki/CA/certs…

[react] react中的setState和replaceState的区别是什么?

[react] react中的setState和replaceState的区别是什么&#xff1f; setState:更新状态 replaceState:替换状态 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

栅格像元做地理坐标映射后的坐标值是像元中心点还是其他位置?

做了下实验&#xff0c;GDAL做完映射后像元&#xff08;x&#xff0c;y&#xff09;--->(lat,lon)&#xff0c;得到的坐标值是像元左上角的坐标值。 下面这个看到更清楚&#xff1a;&#xff08;其实我做了一个替换&#xff0c;实际我求的是左上点和右下点&#xff08;通过&…

TCP的FIN、ACK、SYN、URG、PSH及攻击方式

From: http://www.hackbase.com/tech/2009-10-08/56746.html 三次握手Three-way Handshake  一个虚拟连接的建立是通过三次握手来实现的  1. (B) –> [SYN] –> (A)  假如服务器A和客户机B通讯. 当A要和B通信时&#xff0c;B首先向A发一个SYN (Synchronize) 标记的…

QT Openssl no OPENSSL_Applink 解决

QT5.15.2安装时候选择了openssl1.1.1库&#xff0c;在开发过程中出现OPENSSL_Applink。 解决办法&#xff1a;将openssl include文件下的applink.c 添加到工程中&#xff0c;即可。

Java学习----运算符与表达式

一.运算符 1.算术运算符 - * / % -- public class Test7 {public static void main(String[] args) {int x 10;int y 3;float f 3.5f;System.out.println(x/y); // 3System.out.println(x%y); // 1System.out.println(x/f); // 2.857143 x隐式转换成floatSystem…