Uva-11768 Lattice Point or Not题解

2023-05-16

知识:扩展gcd
题目:题目链接

Now a days a very common problem is:“The coordinate of two points in Cartesian coordinate system is (200, 300) and (4000, 5000).If these two points are connected we get a line segment. How many lattice points are there on this line segment”.You will have to do a similar task in this problem — the only difference is that the terminal coordinates can be fractions.
Input
First line of the input file contains a positive integer N (N ≤ 50000) that denotes how many lines of inputs follow. This line is followed by N lines each of which contains four floating-point numbers x1,y1, x2, y2 (0 < |x1|, |y1|, |x2|, |y2| ≤ 200000). These floating-point numbers has exactly one digit after the decimal point.
Output
For each line of input except the first line produce one line of output. This line contains an integer which denotes how many lattice points are there on the line segment that connects the two points (x1, y1) and (x2, y2).
Sample Input
3
10.1 10.1 11.2 11.2
10.2 100.3 300.3 11.1
1.0 1.0 2.0 2.0
Sample Output
1
0
2

题意:给你两个带一位小数的点坐标,问你在这两个点的连线上有多少个整数点坐标。
思路:利用扩展gcd,求得参数方程通解,在范围内计数 t 。(PS:看完思路后尽量自己先去做一下,实在想不到再看具体方法解析)
方法:

  1. 首先都是一位小数,先将坐标扩大十倍
  2. 然后根据题意有一般方程,即(y1-y2)X+(x2-x1)Y=x2*y1-x1*y2
  3. 再利用扩展gcd求得一组x0,y0,ax0+by0=gcd(a,b);由通解方程知 x’=x0*(c/d);b’=b/d;(ax’+by’=c;b’ = b/gcd(a,b);d=gcd(a,b))
  4. 最后利用 floor((x2-x)/b’) - ceil((x1-x)/b’) + 1 (x2 >= x1, )

PS:通解方程: y = y’ - a’t 、 x = x’ + b’t {a’ = a/gcd(a,b) b’ = b/gcd(a,b)}
//需注意x1==x2或y1==y2时需特判
代码实现:

#include<bits/stdc++.h> // Uva-11768 Lattice Point or Not
#define LL long long  
using namespace std; 
int n;   

LL ex_gcd(LL a,LL b,LL &x,LL &y)//扩展gcd
{
    LL d = a;
    if(!b) x = 1,y = 0;
    else{
      d = ex_gcd(b,a%b,y,x);
      y-=a/b*x;
    }
    return d;
} 

LL solve(double x1,double y1,double x2,double y2)
{
    LL ix1=x1*10 , iy1=y1*10 , ix2=x2*10 , iy2=y2*10;
    if(ix1==ix2){
        if(ix1%10==0) 
            return floor(max(y1,y2))-ceil(min(y1,y2))+1; 
        else return 0;
    }
    if(iy1==iy2){
        if(iy1%10==0) 
            return floor(max(x1,x2))-ceil(min(x1,x2))+1; 
        else return 0;
    }
    //点斜式 推得 下式 a,b,c 
    LL a=(iy1-iy2)*10 , b=(ix2-ix1)*10 , c=ix2*iy1 - ix1*iy2;//这再乘一次十是因为 c (c相当于乘100) 
    LL x,y, d=ex_gcd(a,b,x,y);
    if(c%d) return 0;// c不能整除gcd(a,b) 表明没有整数解 
    b/=d; x*=(c/d); 
    if(x1>x2) swap(x2,x1);
    return floor((x2-x)/b) - ceil((x1-x)/b) +1 ;  //关键 
}
int main()  
{  
    cin>>n;
    while(n--){
        double x1,y1,x2,y2;
        scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
        printf("%lld\n",solve(x1,y1,x2,y2));    
    }
    return 0;  
}   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Uva-11768 Lattice Point or Not题解 的相关文章

  • 将点捕捉到一条线

    我有两个 GPS 坐标 它们连接在一起形成一条线 我还有一个 GPS 点 该点靠近该线 但从未完全在线上 我的问题是 如何找到沿线到给定点最近的点 游戏开发者对此有一个答案 它是用 C 编写的 但应该很容易移植 哪个CarlG has 好心
  • 如何在给定(一条线上的两个点)和(从第三点到第一点的距离)的情况下找到第三点

    给定 一条线上的两个点 和 第三点到第一点的距离 如何找到第三点 语言 Visual Basic 2012 第三点与第二点在同一条线上 并且可能更接近第一点 也可能更接近第二点 这是一个可以处理两者 来自数据数组 的函数 奇怪的是 我似乎无
  • 扩展结构的最简单方法(PointF)

    我们需要用 PointF 沿贝塞尔曲线的位置的 t 参数 存储一条附加信息 由于该数据不容易重新计算 因此我想在计算点时将其与 PointF 一起存储 以便在其他例程中使用 我们有数百个对 PointF 的引用 因此我希望不必创建一个新的替
  • 更改 R/lattice 中与多个面板关联的条带的背景和文本

    以下是我正在处理的示例 require lattice data barley xyplot yield year site data barley 我想为不同的 sprips 设置不同的条带颜色 并且字体颜色也根据背景颜色进行不同的优化
  • 将 3D abline 添加到 Rlattice 包中的云图

    我想将 3D abline 添加到 Rlattice 包中的云散点图 这是我的数据的子集 3 个变量均在 0 1 之间 dat lt structure c 0 413 0 879 0 016 0 631 0 669 0 048 1 0 0
  • 在“应用”中使用数据框列名称作为图表标签

    我想创建一系列 x y 散点图 其中 y 始终是相同的变量 x 是我想要检查它们是否相关的变量 作为一个例子 让我们使用mtcars数据集 我对 R 比较陌生 但正在进步 下面的代码有效 列表图表包含所有图表 除了 X 轴显示为 x 我希望
  • 带 Lattice 和 panel.bpplot 的垂直箱百分位数图

    我正在 R 中使用 box percentile panel 函数绘制 box percentile 图Hmisc panel bpplot with bwplot from lattice 我有一个数字向量 Length 并希望显示其在因
  • 在 R 中的点阵图例图中包含线和点

    大家好 我正在处理格子图 一切正常 但我在图例方面遇到了一些麻烦 我在用xyplot 而且效果非常棒 我的数据框是NM I add dput 最后部分的版本 AMes A2009 A2010 A2011 A2012 A2013 A2014
  • 如果使用 source() 运行,R 包lattice将不会绘制

    我开始使用lattice图形包但我偶然遇到了一个问题 我希望有人能帮助我 我想使用相应的函数绘制直方图 这是文件foo r library lattice data lt data frame c 1 2 c 2 3 colnames da
  • 获取点阵条形图函数中分组条形的中点值

    我试图弄清楚如何确定分组条形的中点值 即每个条形中心的实际 X 位置 这在基本 R 中很容易完成barplot功能 但是我希望能够做到这一点lattice s barchart 我的目标是在相应栏的顶部显示文本列的值 只要我不使用子组 下面
  • 多边形中的点

    我正在尝试解决一些 SPOJ 问题https www spoj pl problems FSHEEP https www spoj pl problems FSHEEP 我们必须找出点是否在多边形内部 正如我们所看到的 它不是凸多边形 问题
  • 更改格子图中条带上的文本

    如何更改格子图中显示的文本 例子 假设我有一个由 3 列组成的数据框测试 x 1 1 2 3 4 5 6 7 8 9 10 y 1 A A A A A B B B B B a 1 1 9952066 1 7292978 0 8789127
  • 点阵图条件填充颜色

    Problem 我有一个数据框 我想用lattice的面板点图 不是ggplot2 对其进行可视化 它包含一个变量 应有条件地使用该变量通过不同的颜色填充突出显示数据 可重现的例子 require lattice Make reproduc
  • 使用 LINQ 按距离过滤点 XY

    我有一个 XY 点列表 我想按给定距离对它们进行分组 假设它们之间距离为 x 的所有点都应分组在不同的列表中 基本上 如果我有 A 0 0 B 0 1 C 0 2 我想对 maxDistance 为 1 的所有点进行分组 以获得 A B C
  • 使用 ggplot2 再现格子树状图

    这可以用 ggplot2 重现这个格子图吗 library latticeExtra data mtcars x lt t as matrix scale mtcars dd row lt as dendrogram hclust dist
  • 在 Android 上查找圆上的点

    一切看起来都那么简单明了 直到我必须真正对其进行编程 我有什么 我上传了一张图片以更好地解释它 我有一个圈子 我知道 它是半径 中心点坐标 每个按钮的初始坐标 红色圆圈 我希望能够在将灰色圆形图像旋转 10 度时计算红色按钮的新坐标 x1y
  • 使用 pyqtgraph 和 LiDAR 快速实时绘制点

    我想创建一个实时的点图 GUI 我正在使用 Scanse Sweep LiDAR 每次扫描该 LiDAR 工作频率为 1 10Hz 时 我都会收到大约 1000 个描述 LiDAR 周围环境的点 x y 这是一个 2D 激光雷达 我到处寻找
  • 为什么 java.awt.Point 提供了设置和获取双精度数的方法,但将 x 和 y 存储为 int?

    正如您在 Oracle 文档中看到的java awt Point http docs oracle com javase 6 docs api java awt Point html x 和 y 存储为int 然而 getX and get
  • 更改箱线图的布局并向其添加标签

    我想 有人建议这样做 创建具有不同外观的箱线图并为其添加标签 预期 不完整 的输出将如下所示 每个框都有四分位数标签 和样本大小 boxplot len supp dose data ToothGrowth notch TRUE col c
  • OpenGL ES 2.0 中的纹理点?

    我正在尝试在 OpenGL ES 2 0 中为粒子系统实现纹理点 例如点精灵 我遇到的问题是所有点都渲染为实心黑色方块 而不是正确映射纹理 我已经验证 gl PointCoord 实际上返回从 0 0 到 1 0 的 x y 值 这将映射到

随机推荐