【数论基础】欧几里德算法及其各种应用
目录:
- 欧几里德算法(辗转相除法)
- 1.问题引入:线段上格点的个数
- 2.输入两个正整数,求最大公约数和最小公倍数
- 3.P1029 最大公约数和最小公倍数问题
欧几里德算法(辗转相除法)
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。
1.问题引入:线段上格点的个数
问题描述:给定平面上的两个格点P1=(x1,y1)和P2=(x2,y2),线段P1P2上,除P1和P2以外一共有几个格点?
限制条件:-109≤x1,y1,x2,y2≤109
辗转相除法的原理:①a=b∗p+qa=b*p+qa=b∗p+q,所以gcd(b,q)gcd(b,q)gcd(b,q)既整除a又整除b,也就整除gcd(a,b)gcd(a,b)gcd(a,b)(公约数整除最大公约数)②q=a−b∗pq=a-b*pq=a−b∗p,同理可证gcd(a,b)gcd(a,b)gcd(a,b)整除gcd(b,q)gcd(b,q)gcd(b,q)。综上有gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a。不断这样操作下去,由于gcd的第二个参数总是不断减小的,最后会出现gcd(a,b)=gcd(c,0)gcd(a,b)=gcd(c,0)gcd(a,b)=gcd(c,0),而0和c的最大公约数就是c,所以gcd(c,0)=cgcd(c,0)=cgcd(c,0)=c,这样就计算出了gcd(a,b)gcd(a,b)gcd(a,b)
本题中虽然可以用穷举法,遍历min(x1,x2)≤x≤max(x1,x2)
且min(y1,y2)≤y≤max(y1,y2)
的格点可以得到正确答案,但是复杂度确实O(|x1−x2|×|y1−y2|)
,其实这个题的答案是|x1−x2|和|y1−y2|
的最大公约数减去1。(注意,|x1−x2|=0&&|y1−y2|=0
时,答案为0)
原因
首先看一下|x1−x2|和|y1−y2|的
最大公约数代表的是啥? 其实可以看成 在横向和竖向的最大的公共等分数, 比如 6 的等分点可以是 1:1:1:1:1:1分成6份 ,也可以是
2:2:2分成3份,或者是 6,只有1份。(其实对应的是 6能被6,3,1整除) 那么 6和9的最大公共等分数是3,即6分为 2:2:2 ,
9分为3:3:3. 那么边长为6和9的矩形,按照这样分会是什么情况呢?
通过上图可以看出,大矩形的对角线正好经过 (2,3),(4,6),(6,9) 除开(6,9),就是本体所要求的点。这就是为什么这个题的答案是|x1−x2|和|y1−y2|的最大公约数减去1。
那这个题可以转换为求最大公约数的问题,最大公约数一般使用辗转相除法
#include<bits/stdc++.h>
using namespace std;
int gcd(int x, int y)
{if (y==0) return x;return gcd(y, x%y);
}
int x1,x2,y1,y2;
int main()
{cin>>x1>>y1>>x2>>y2;cout<<gcd(abs(x1-x2),abs(y1-y2))-1<<endl;
}
2.输入两个正整数,求最大公约数和最小公倍数
最大公约数和最小公倍数的乘积就是原两个数的积。
#include<bits/stdc++.h>
using namespace std;
int gcd(int x, int y)
{if (y==0) return x;return gcd(y, x%y);
}
int m,n,d,e;
int main()
{scanf("%d%d",&m,&n);if(m < n)swap(n,m);printf("最大公约数=%d\n最小公倍数=%d\n",gcd(m,n),m*n/gcd(m,n));return 0;}
3.P1029 最大公约数和最小公倍数问题
要知道最大公约数和最小公倍数的乘积就是原两个数的积。
两种方法超详细解答链接
注:如果您通过本文,有(qi)用(guai)的知识增加了,请您点个赞再离开,如果不嫌弃的话,点个关注再走吧,日更博主每天在线答疑 ! 当然,也非常欢迎您能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答!( •̀ ω •́ )✧
【数论基础】欧几里德算法及其各种应用相关推荐
- 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)
摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...
- ACM数论之旅4---扩展欧几里德算法(欧几里德(・∀・)?是谁?)
为什么老是碰上 扩展欧几里德算法 ( •̀∀•́ )最讨厌数论了 看来是时候学一学了 度娘百科说: 首先, ax+by = gcd(a, b) 这个公式肯定有解 (( •̀∀•́ )她说根据数论中的相 ...
- 紫薯第10章数学 kaungbin专题14数论基础
杂谈 kuangbin14数论Harmonic Number LightOJ - 1234 分段打表 + 欧拉爷爷o(1).(第一次触及了欧拉常熟) 10.1.1 && 10.1.2 ...
- 扩展欧几里德算法详解
转自:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两 ...
- 浅析欧几里德算法 GCD和LCM
前言 欧几里德算法作为有着非常简短的实现的算法,可能很多初学者(包括当时的我)都不求甚解.本文给出了GCD.LCM的性质,以及欧几里德算法的实现.证明和时间复杂度推导. 这里是我的个人网站: http ...
- 【数论】数论基础合集
大佬的数论合集 目录 强烈推荐:大佬的博客:数论算法详解,超详细 一.欧几里得算法 二.扩展欧几里得算法 1.扩展欧几里得 扩展欧几里得原理 定理 (1).扩展欧几里得算法应用 (2)例题1.求整数x ...
- poj 2115 C Looooops(扩展欧几里德算法)
题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循环几次才会结束. 比如:当k=4时,存储的数 i 在0-15之间循环.(本题默认为无符号) 若在有限次内结束,则输出 ...
- poj 1061 (扩展欧几里德算法)
首先先抛出一个例题: 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 89761 Acc ...
- 欧几里德算法+拓展欧几里德算法
欧几里德算法一般简写为GCD,即辗转相除求最大公因数,模板为 ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b); } 由于这种求的方法适用于大数,所以一般数据类型 ...
最新文章
- mysql三范式和反三范式_数据库三范式和反三范式
- 使用计算机时什么是开机键什么是关机键,计算器上的开机键是关机键是
- Win11系统语言修改不了中文怎么办
- CodeFx: 微软一站式开发技术框架 2009-10-18 最新版本新鲜出炉啦!!!
- 我的WCF之旅(13):创建基于MSMQ的Responsive Service(转载)
- unity设置一个物体是另一个物体的子物体
- Charles抓包工具简单教程
- Linux分区类型EXT2、EXT3、EXT4详解
- 动手写一个二叉平衡树
- STEAM 教育相关书籍
- Xcode各种运行报错及解决方法
- Linux:crond任务调度之at定时任务
- 软件测试需要会python吗_真实揭秘90后职业新选择:25岁刚入行软件测试,竟拿到这么多薪资……...
- 为什么主页是http://123.sogou.com/,改不了,我还以为中木马了
- EasyRecovery是最好用的手机数据恢复工具
- HMC833 测试板总结
- fcitx只能打繁体字无法切换的一个解决方法linux mint
- Android手机4G网络设置ipv6
- 有几种水果不能空腹吃,你知道吗?
- vue+css漂亮的定制日历