欧几里德定理:

对于整数a,b来说,gcd(a, b)==gcd(b, a%b)==d(a与b的最大公约数),又称为辗转相除法

证明:

因为a是d的倍数,b是d的倍数;所以a%d==0;b%d==0;

设k=a/b;r=a%b;则 a=k*b+r;

由上得出:r=a-k*b;

因为a和b都是d的倍数,所以(a-k*b)也是d的倍数,所以r也是d的倍数;

所以gcd(a, b)==gcd(b, a%b)==d

而为什么要证明gcd(a, b)==gcd(b, a%b)==d这个式子成立呢?

其实证明gcd(a, b)==gcd(a, a%b)==d这个式子成立也是可以的,因为a也是d的倍数,但是在进行递归之前要进行一步操作,就是判断a与b的大小,如果a<b,就没办法进行递归或者循环求最大公约数,那么如果a<b,就交换a与b,之后就不用交换了,因为已知a>b,那么a%b<a必定成立;

事实发现证明gcd(a, b)==gcd(b, a%b)==d这个式子会缩小处理的数据的范围;

欧几里德应用:

用来求a,b的最大公约数。

代码实现:

//gcd(a, b)==gcd(a, a%b)==d,也成立
#include<stdio.h>
int main()
{
int m, n, r, t;
scanf("%d%d", &m, &n);
if(m<n)
{
t=m;
m=n;
n=t;
}
while(r=m%n, r!=0)
{
m=m;
n=r;
}
printf("%d\n", n);
return 0;
}

  

//gcd(a, b)==gcd(a, a%b)==d递归
int gcd(int m, int n)
{
return n?gcd(n, m%n):m;
}

  

//gcd(a, b)==gcd(a, a%b)==d递归
int gcd(int m, int n)
{
if(m%n==0)
return n;
else
return gcd(n, m%n);
}

  

//gcd(a, b)==gcd(b, a%b)==d 循环
while((r=m%n)!=0)
{
  m=n;
  n=r;
}

扩展欧几里德定律: 

对于不完全为0的非负整数a,b;gcd(a, b)表示a, b的最大公约数,必定存在整数对x,y,满足a*x+b*y==gcd(a, b);

证明:

a*x1+b*y1=gcd(a, b); 

b*x2+(a%b)*y2=gcd(b, a%b);

因为由欧几里德定理知:gcd(a, b)==gcd(b, a%b)

所以a*x1+b*y1=b*x2+(a%b)*y2;     因为r=a%b,   r =a-k*b所以==>

a*x1+b*y1=b*x2+(a-k*b)*y2;         因为k=a/b;所以 ==>

a*x1+b*y1=b*x2+(a-(a/b)*b)*y2;     展开得到  ==>    

a*x1+b*y1=b*x2+a*y2-b*(a/b)*y2;  转换得到      ==>

a*x1+b*y1=a*y2+b*(x2+(a/b)*y2);

观察上式可知 x1=y2, y1=x2-a/b*y2;

由此可知x1,y1是由x2,y2得出来的,由此类推x2,y2是由x3,y3得出来的,

那什么时候是终止呢?也就是递归gcd(a, b)中b=0时;也就是说此时a的值就是要求得最大公约数

即gcd(a, 0)此时由扩展欧几里得定律a*x+b*y==gcd(a, b)知 a*x+b*y=a;

解出x=1, y=0;

此时就是递归终止的地方:

扩展欧几里德应用:

就我目前所知的就是:求解不定方程;如a*x+b*y=c; 已知a, b, c的值求x和y的值

那么问题来了,如何将扩展欧几里德定律应用在求解不定方程呢?

可以这样转化   a*x+b*y=gcd(a, b)*c/gcd(a, b);

最后转化为 a*x/(c/gcd(a, b))+b*y/(c/gcd(a, b))=gcd(a, b); 最后求出的解x0,y0乘上c/gcd(a, b)就是最终的结果了

x1=x0*c/gcd(a, b);

y1=y0*c/gcd(a, b);

代码实现:  举例说明:http://codeforces.com/problemset/problem/7/C

#include<stdio.h>
long long exgcd(long long a, long long b, long long &x, long long &y);
int main()
{
long long a, b, c, ans, x, y; while(scanf("%lld%lld%lld", &a, &b, &c)!=EOF)
{
ans=exgcd(a, b, x, y);
if(c%ans==0)
{
x=-x*c/ans;
y=-y*c/ans;
printf("%lld %lld\n", x, y);
}
else
printf("-1\n");
}
return 0;
}
long long exgcd(long long a, long long b, long long &x, long long &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
long long r=exgcd(b, a%b, x, y), t;
t=x;
x=y;
y=t-(a/b)*y;
return r;
}

 但这只是求得了一组解x1,y1

对于x,y对应的解集是:

x=x1+b/gcd(a, b)*t;

y=y1-b/gcd(a, b)*t;

但是我证明不出来,如果哪位大神懂得,可以给我说说!

欧几里德和扩展欧几里德详解 以及例题CodeForces 7C的更多相关文章

  1. 开启PHP exif扩展方法详解

    服务器配置说明: 1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号2.在php.ini文件中找到;extension=php_mbstring.dll,去掉 ...

  2. SpringBoot各类扩展点详解

    一.前言 上篇文章我们深入分析了SpringBoot的一站式启动流程.然后我们知道SpringBoot的主要功能都是依靠它内部很多的扩展点来完成的,那毋容置疑,这些扩展点是我们应该深入了解的,那么本次 ...

  3. BSGS算法_Baby steps giant steps算法(无扩展)详解

    Baby Steps-Varsity Giant Step-Astronauts(May'n・椎名慶治) 阅读时可以听听这两首歌,加深对这个算法的理解.(Baby steps少女时代翻唱过,这个原唱反 ...

  4. 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  5. 中国剩余定理(CRT)及其扩展(EXCRT)详解

    问题背景   孙子定理是中国古代求解一次同余式方程组的方法.是数论中一个重要定理.又称中国余数定理.一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作<孙子算经>卷下第 ...

  6. BIT 树状数组 详解 及 例题

    (一)树状数组的概念 如果给定一个数组,要你求里面所有数的和,一般都会想到累加.但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组 ...

  7. [转]用C/C++扩展PHP详解

    原文:http://www.imsiren.com/archives/547 一个简单的扩展模块 PHP非常容易扩展,因为它提供了我们想用的所有API. 如果要新建一个扩展,需要在PHP源码中执行ex ...

  8. artDialog学习之旅(二)之扩展方法详解

    名称 描述 核心方法 art.dialog.top 获取artDialog可用最高层window对象.这与直接使用window.top不同,它能排除artDialog对象不存在已经或者顶层页面为框架集 ...

  9. C#中的扩展方法详解

    “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.”这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类 ...

随机推荐

  1. rpm方式安装 gitlab centos7

    一.使用RPM安装 - 推荐 官方推荐的下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/ Tips 1 : Centos 7使用el7 ...

  2. video事件

    /** video播放器*/ * @ src: 指定所要嵌入视频.文档的URL. * @ poster: 视频预览图像 * @ autoplay: 视频自动播放 * @ loop: 循环播放 * @ ...

  3. 关于wcf三大工具的使用(wsdl.exe svcutil.exe disco.exe)

    首先,我们必须创建一个wcf服务.并部署到IIS中.这里我已经将一个StudentService服务部署到我自己的电脑了. (1)svcutil.exe svcutil.exe工具的作用是通过服务地址 ...

  4. mysql格式化日期的函数

    转自:https://www.cnblogs.com/duhuo/p/5650876.html mysql格式化日期   mysql查询记录如果有时间戳字段时,查看结果不方便,不能即时看到时间戳代表的 ...

  5. AVG

    AVG([ DISTINCT | ALL ] expr) [ OVER(analytic_clause) ] SELECT MANAGER_ID,           LAST_NAME,       ...

  6. 从零打造在线网盘系统之SSH框架整合

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...

  7. shell 文件备份脚本

    #!/bin/bash #输入参数:文件名 filename=$ #源文件目录 directory=/opt/docker/cloud-driver-training/apps #备份文件目录 bac ...

  8. html5新属性contenteditable 对于那些不可编辑的标签,现在都可以编辑了

    contenteditable = true 表示该html标签的内容可以编辑,对于那些不可编辑的标签,现在都可以编辑了.

  9. Linux定时检测内存,若使用率超过指标,重启Tomcat并清空内存

    cd /usr/local vim cleanCacheTime.sh 把以下代码粘贴进去 #!/bin/bash echo "start SyncCleanCache.sh..." ...

  10. [SQL] 让特定的数据 排在最前

    MYSQL目前常用的两种方法,如下: 让值为"张三" 的数据排在最前. -- 方法一 end asc -- 方法二 select * from tableName where co ...