欧几里德和扩展欧几里德详解 以及例题CodeForces 7C
欧几里德定理:
对于整数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的更多相关文章
- 开启PHP exif扩展方法详解
服务器配置说明: 1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号2.在php.ini文件中找到;extension=php_mbstring.dll,去掉 ...
- SpringBoot各类扩展点详解
一.前言 上篇文章我们深入分析了SpringBoot的一站式启动流程.然后我们知道SpringBoot的主要功能都是依靠它内部很多的扩展点来完成的,那毋容置疑,这些扩展点是我们应该深入了解的,那么本次 ...
- BSGS算法_Baby steps giant steps算法(无扩展)详解
Baby Steps-Varsity Giant Step-Astronauts(May'n・椎名慶治) 阅读时可以听听这两首歌,加深对这个算法的理解.(Baby steps少女时代翻唱过,这个原唱反 ...
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...
- 中国剩余定理(CRT)及其扩展(EXCRT)详解
问题背景 孙子定理是中国古代求解一次同余式方程组的方法.是数论中一个重要定理.又称中国余数定理.一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作<孙子算经>卷下第 ...
- BIT 树状数组 详解 及 例题
(一)树状数组的概念 如果给定一个数组,要你求里面所有数的和,一般都会想到累加.但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组 ...
- [转]用C/C++扩展PHP详解
原文:http://www.imsiren.com/archives/547 一个简单的扩展模块 PHP非常容易扩展,因为它提供了我们想用的所有API. 如果要新建一个扩展,需要在PHP源码中执行ex ...
- artDialog学习之旅(二)之扩展方法详解
名称 描述 核心方法 art.dialog.top 获取artDialog可用最高层window对象.这与直接使用window.top不同,它能排除artDialog对象不存在已经或者顶层页面为框架集 ...
- C#中的扩展方法详解
“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.”这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类 ...
随机推荐
- 【linux系列】linux防火墙的关闭开启
即时生效 开启:service iptables start 关闭:service iptables stop 重启后生效 开启:chkconfig iptables on 关闭:chkconfig ...
- LightOJ 1348(Aladdin and the Return Journey )
题目链接:传送门 题目大意:一棵无根树,每个点上有权值,两种操作,0 x y询问x~y路径上权值和 1 x y将 节点 x 权值变为y.对于询问操作输出答案. 题目思路:树链剖分 #include & ...
- 暴力破解工具hydra
Hydra是一个并行登录的裂解装置,它支持众多的协议来攻击.新的模块很容易的添加,旁边,它是灵活的,而且速度非常快. 首先安装的是hydra的支持库包软件. yum -y install openss ...
- apache工作模式worker以及prefork的切换
apache比较常用的工作模式有worker以及prefork两种方式. 如果在编译时候不指定,系统默认的是prefork模式:如果需要换成worker模式,需要在编译的时候带上编译参数:--with ...
- 用到了yii2 hasMany() 方法,一对多关联
view页面代码:其中supply,item,price是一个AR类都是一个类,item和prices是一对多关系: [ 'label' => '参考', 'format' => 'htm ...
- EF和PetaPoco实现快速开发
PetaPoco是一款适用于.NET应用程序的轻型对象关系映射器(ORM, Object Relational Mapper).与那些功能完备的ORM(如NHibernate或Entity Frame ...
- poj1463 Strategic game【树形DP】
Strategic game Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 9582 Accepted: 4516 De ...
- Python默认调用路径
记录个遇到的小问题,防止下次遇到忘记怎么解. 起因:pip安装扩展库时提示安装完成,但是在Python 终端下无法import 现象:终端直接运行python 时提示如下:(2.7.13)然而用/us ...
- State of the official Elasticsearch Java clients
Elasticsearch Java Clients | Elastic https://www.elastic.co/blog/state-of-the-official-elasticsearch ...
- CentOS安装Nginx-1.6.2+安全配置+性能配置
注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. #准备工作# 在安装Nginx之前,请确保已经使用yum安装了pcre等基础组件,具体见<CentOS安装LNMP环境的基础 ...