gcd和ex_gcd
gcd就是欧几里得算法,可以快速的求出俩个数的最大公因数,进而也可以求其最大公倍数(俩数之积除以最大公因数),比较简单直接看代码就好了,一般用递归版,简短精简,敲得快,但如果数剧奇葩,怕溢出,那就用递推版的。
递归版:
int gcd(int a,int b)
{ if(b==0)
return a;
return gcd(b,a%b);
}
递推版:
int gcd(int a,int b)
{ int r=a%b
while(r>0)
{ a=b;
b=r;
r=a%b; }
return b;
}
ex_gcd就是扩展欧几里得算法,解这个方程:ax+by=d 。也就是ax+by=gcd(a,b) 。若要方程有解,则d=k*gcd(a,b)。是吧.
所以这个函数就是解的这个方程ax+by=gcd(a,b),而最后给解扩大k倍,使d=k*gcd(a,b)就看题意了。
int ex_gcd(int a,int b,int &x,int &y)
{ if(b==0)
{ x=1,y=0;
return a: }
int r=ex_gcd(b,a%b,x,y);
int t=x;
x=y; //解这个方程根据数学推导: x,y表示第一次递归时的值,x1,y1表示第二次递归时的值。那么 y=t-a/b*y; gcd(a,b)==gcd(b,a%b),同时都代入原方程,有ax+by==b*x1+(a%b)*y1。将右边变形一下 b*x1+(a%b)*y1==b*x1+(a-(a/b)*b)*y1==a*y1+b*(x1-(a/b)*y1),最终得到ax+by==a*y1+b*(x1-(a/b)*y1)
return r; 于是才有这个递归通式:x=y1;y=x1-a/b*y1
}
最后函数返回的r是a,b的最大公因数,这应该没问题吧,x,y分别存储函数的一组解。
x=x*(d/r);
y=y*(d/r);//或y=(d-ax)/b;
通常让求x的最小正整数解那么x=(x%(d/r)+d/r)%(d/r). y=(d-ax)/b.
扩展欧几里得用的比较多,各种应用题可以列这个方程解,还有逆元,求a对m的逆元,就是解方程ax+my=1的解(我们已经知道 (a*b)%m=(a%m*b%m)%m 那么如果求(a*b/c)%m则应该怎么化解 ,这时候就要求c的逆元,原式=(a%m*b%m*c~)%m,其中c~是c的逆元)
待续……
gcd和ex_gcd的更多相关文章
- HDU 5768 Lucky7 (中国剩余定理 + 容斥 + 快速乘法)
Lucky7 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 Description When ?? was born, seven crow ...
- CodeForces 689E Mike and Geometry Problem (离散化+组合数)
Mike and Geometry Problem 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/I Description M ...
- ZOJ 3903 Ant(数学,推公示+乘法逆元)
Ant Time Limit: 1 Second Memory Limit: 32768 KB There is an ant named Alice. Alice likes going ...
- HDU 5793 A Boring Question (找规律 : 快速幂+逆元)
A Boring Question 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5793 Description Input The first l ...
- Educational Codeforces Round 16 D. Two Arithmetic Progressions (不互质中国剩余定理)
Two Arithmetic Progressions 题目链接: http://codeforces.com/contest/710/problem/D Description You are gi ...
- 数论学习笔记之解线性方程 a*x + b*y = gcd(a,b)
~>>_<<~ 咳咳!!!今天写此笔记,以防他日老年痴呆后不会解方程了!!! Begin ! ~1~, 首先呢,就看到了一个 gcd(a,b),这是什么鬼玩意呢?什么鬼玩意并不 ...
- 数论只会GCD。。。
一些关于GCD的代码.... #include <iostream> #include <cstdio> #include <cstring> using name ...
- HDU5780 gcd 欧拉函数
http://acm.hdu.edu.cn/showproblem.php?pid=5780 BC #85 1005 思路: 首先原式化简:x^gcd(a,b)−1 也就是求n内,(公约数是i的 ...
- 模板-gcd
GCD int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); } EXGCD void ex_gcd(int a, int b, int & ...
随机推荐
- 1027 HTML的初学
HTML 是一种超文本标记语言内容(Hyper Text Markup Language) CSS 网页美化 Javascript 脚本语言(JS) H ...
- fir.im Weekly - 技术人也要苦练“七十二变”
一年又一年,Code,Build,Run.多少技术人像"孙悟空"一样,日复一日苦练"七十二变",笑对"八十一难",最后能"取经成功 ...
- fir.im Weekly - iOS9 适配开发教程
期待已久的 iOS 9 发布了,很多人更新完毕得出结论:这是值得升级的版本.随之而来的是适应 iOS9 开发技术.本期 Weekly 收集了一些关于 iOS9 相关的开发资源,希望对你有帮助. iOS ...
- js显示yyyy年mm日dd天 星期几 的格式日期
js代码: <script type="text/javascript"> var today = new Date(); var week; //存储星期几 var ...
- javascript_core_07之错误处理、函数作用域
1.错误处理:保证程序发生错误时,不会被强制退出: ①处理方式:try{可能出错的正常语句:}catch(err){只有出现错误时才执行的错误处理代码:}finally{无论是否出错都必须执行的代码: ...
- IBM appscan 9.0破解版分享
简介:IBM AppScan该产品是一个领先的 Web 应用安全测试工具,曾以 Watchfire AppScan 的名称享誉业界.Rational AppScan 可自动化 Web 应用的安全漏洞评 ...
- MySQL5.7.13源代码阅读心得
1.使用gdb这个调试工具. 在linux使用该调试工具非常简单.它的价值非常大,可以告诉你函数相互调用的逻辑(bt命令),告诉你函数执行的情况(通过br命令以及n,c命令单步跟踪函数每一个语句的执行 ...
- javascript基础语法——词法结构
× 目录 [1]java [2]定义 [3]大小写[4]保留字[5]注释[6]空白[7]分号 前面的话 javascript是一门简单的语言,也是一门复杂的语言.说它简单,是因为学会使用它只需片刻功夫 ...
- 理解 angular2 基础概念和结构 ----angular2系列(二)
前言: angular2官方将框架按以下结构划分: Module Component Template Metadata Data Binding Directive Service Dependen ...
- web前端学习笔记(CSS盒子的浮动)
在标准流中,一个块级元素在水平方向会自动伸展,直到包含它的元素的边界:而在竖直方向和兄弟元素依次排列,不能并排.使用“浮动”方式后,块级元素的表现就会有所不同. CSS中有一个float属性 ...