最大公约数的运用
2016-02-02 18:31
155 查看
转载自http://www.ithao123.cn/content-3667419.html
线段上格点的个数
给定平面上的两个格点P1(x1,y1)和P2(x2,y2),
线段上P1P2上,除P1和P2以外一共有多少格点
虽然可以用穷举法,遍历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。
那这个题可以转换为求最大公约数的问题,最大公约数一般使用辗转相除法
辗转想法的原理:
如果有两个自然数a和b(a>b),
可以写成a=k×b+c
情况1:如果c=0,那么gcd(a,b)=b
情况2:如果c≠0
, 那么gcd(a,b)=gcd(b,c)
相关文章推荐
- Splinter学习--模拟攥写博客园随笔
- HashMap和HashTable的区别
- 持盈履满,君子兢兢
- app crash率的标准
- 6 继承
- VS2013出现应用程序无法正常启动
- java web 获取客户端真实IP
- IE10修改select样式
- ||C||<基础>C语言基础知识框架结构//个人整理使用|仅供参考|
- django 的几个操作指令及错误解决方法
- Tomcat配置SSL
- 最简单的ListView
- 堆排序模板
- <2016-2-2 总结>
- POJ-1475-Pushing Boxes(BFS)
- android获取音频、视频、图片信息
- java1.8的几大新特性(二)
- SWOOLE异步REDIS安装
- GIT和SVN之间的五个基本区别
- js常用几种类方法实现