线段上的格点 辗转相除法(GCD)
/*
问题描述:
线段上的格点
给定平面上的两个格点 P1 = (x1, y1) ; P2 = (x2, y2) 线段P1 P2上,除P1 和 P2以外一共有几个格点
*/
/*
分析过程
在格点上画P1(0,5) P2(5,0) 连接起来发现 这条线上的经过的格子的格点都在P1 P2这条线段上
将其不称 P1 P2为斜边的直角三角形 发现因为每一个小的三角形 和大三角形都是相似
再画P1(0, 8) P2(3,4) 这条线段上没有格点 但是如果向下扩展成一个边之比为2的一个相似三角形 得到
P1(0, 8) P2'(6, 0) 那么发现 刚才的P2(3,4)就是这个新的线段上的一个格点
所以也就是说 当线段中的点构成的三角形 和大三角形相似 且成整数倍的时候 这个格点就在格点上
那么要计算多少个这样的三角形 --->>找出最小的相似三角形 设P1(x1, y1) P2(x2,y2)
最小的三角形 直角边长 |x1-x2| / gcd(|x1-x2|, |y1-y2|) , |y1-y2| / gcd(|x1-x2|, |y1-y2|)
显而易见 那么这样最小三角形的个数 就是gcd(|x1-x2|, |y1-y2|)
所以这道题就是求gcd(|x1-x2|, |y1-y2|)
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#define READ() freopen("in.txt", "r", stdin);
#define MAXV 2007
#define MAXE 20007
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std; typedef pair<int,int> P; //复杂度 < O(log max(a,b))
int gcd(int x, int y)//辗转相除法
{
if (y == ) return x;
else return gcd(y , x % y);
}
int main()
{
READ()
P p1, p2;
int x, y;
scanf("%d%d", &p1.first, &p1.second);
scanf("%d%d", &p2.first, &p2.second);
x = abs(p1.first - p2.first);
y = abs(p1.second - p2.second);
// if (x < y)
// swap(x, y);可以不用swap因为 一次gcd后 自动就变为x > y
int ans = gcd(x, y);
cout << ans - << endl;//因为最后一个是自己线段上这个端点
return ;
}
线段上的格点 辗转相除法(GCD)的更多相关文章
- E. Covered Points (线段上的整点数)
题目链接:https://codeforces.com/contest/1036/problem/E 思路:学会了一个在线段上的整数点等于 GCD(x1 - x2, y1 - y2) + 1,然后去 ...
- Water Testing【皮克定理,多边形面积,线段上点的数目】
Water Testing 传送门:链接 来源:UPC 9656 题目描述 You just bought a large piece of agricultural land, but you n ...
- URAL 1966 Cycling Roads 点在线段上、线段是否相交、并查集
F - Cycling Roads Description When Vova was in Shenzhen, he rented a bike and spent most of the ...
- excel小技巧-用于测试用例的编号栏:“获取当前单元格的上一格的值+1”=INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1
编写用例的时候使用,经常修改用例的时候会需要增加.删除.修改条目,如果用下拉更新数值的方式会很麻烦. 1.使用ctrl下拉,增删移动用例的时候,需要每次都去拉,万一列表比较长,会很麻烦 2.使用ROW ...
- 辗转相除法(GCD)求左旋转字符串
本文写于2017-01-18,从老账号迁移到本账号,原文地址:https://www.cnblogs.com/huangweiyang/p/6297874.html 今天在牛客网上做了一道题,题意就是 ...
- HDU 4305 Lightning(计算几何,判断点在线段上,生成树计数)
Lightning Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- java 判断点是否在一条线段上
public static void main(String[] args) { Scanner scan = new Scanner(System.in); Point point1 = new P ...
- HDU4305:Lightning(生成树计数+判断点是否在线段上)
Lightning Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- Gym 101873G - Water Testing - [皮克定理]
题目链接:http://codeforces.com/gym/101873/problem/G 题意: 在点阵上,给出 $N$ 个点的坐标(全部都是在格点上),将它们按顺序连接可以构成一个多边形,求该 ...
随机推荐
- Windows API函数大全四
10. API之硬件与系统函数 ActivateKeyboardLayout 激活一个新的键盘布局.键盘布局定义了按键在一种物理性键盘上的位置与含义 Beep 用于生成简单的声音 CharToOem ...
- 算法之A星算法(寻路)
1.启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省略大量无谓的搜索路径,提高了效率.在启发式搜索中,对位置的估价是十分 ...
- Android(java)学习笔记165:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例的优化:请求码和结果码)
1.开启界面获取返回值 (1)采用一种特殊的方式开启Activity: startActivityForResult(intent , 0): (2)在被开启的Activi ...
- VBA Promming入门教程——变量的使用
数据类型 VBA中的数据类型可分为两种 示例 String Sub Main Dim s as string s = "Hello" msgbox(s) End Sub Singl ...
- 如何移除不再插入Windows设备的信息
Howto: Remove devices from Windows that are not connected to the system anymore 如何移除不再插入Windows设备的信息 ...
- 解决Invalid bound statement (not found)(Mybatis的Mapper绑定问题)
一.问题描述 使用mybatis的项目在本地可以正常运行,但当使用maven或Jenkins打包部署到服务器上时出现了绑定错误,异常信息为: org.apache.ibatis.binding.Bin ...
- python-opencv遍历图片像素,并对像素进行操作
看代码: def access_pixels(frame): print(frame.shape) #shape内包含三个元素:按顺序为高.宽.通道数 height = frame.shape[0] ...
- Informatica抽取SQL Server数据库乱码
1.首先确认数据库的关系连接所使用的代码页,是否一致 2.如果上述方法不行,在Designer中更改数据类型,将string类型改为nstring类型,中文就没有乱码了 3.SQL Server数据库 ...
- catalina配置参数
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.por ...
- CSS3---box-shadow设置
1.box-shadow是向盒子添加阴影.支持添加一个或者多个. 2.box-shadow: X轴偏移量 Y轴偏移量 [阴影模糊半径] [阴影扩展半径] [阴影颜色] [投影方式]; 3.注意:ins ...