首先本题需要用到扩展欧几里得算法……

关于exgcd算法的一点简略证明:

那么,对于函数exgcd(a,b)=(d,x,y),其中d满足d=gcd(a,b); (x,y)满足ax+by=d;

则exgcd(b,a mod b)=(d,x',y'),而此时,使用 x = y' ;  y = x' - floor(a/b) * y' = x' - floor(a/b) * x 就能得到exgcd(a,b)的值。

故我们可以有扩展欧几里得算法如下:

void exgcd(int a,int b,int &d,int &x,int &y){
if(!b){d=a;x=;y=;}
else {exgcd(b,a%b,d,y,x);y-=(a/b)*x;}
}

此处的边界条件是exgcd(a,0)=(a,1,0)

那么此时,若c mod gcd(a,b) = 0,就容易求得一个整点(x,y),那么如何得到所有的点?

然后是题目的代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
if(!b){d=a;x=;y=;}
else {exgcd(b,a%b,d,y,x);y-=(a/b)*x;}
}
int main() {
double X1,Y1,X2,Y2;
int t;
scanf("%d",&t);
while(t--){
scanf("%lf%lf%lf%lf",&X1,&Y1,&X2,&Y2);//获得初始坐标(x1,y1),(x2,y2)
ll x1=X1*,x2=X2*,y1=Y1*,y2=Y2*;//将坐标都换成整型
if(x1==x2)//如果这条线是一条竖直的线
{
if(x1%!=){//如果此时的直线l:x=c,c不是整数,那么这条线上显然没有整点
printf("0\n");
continue;
}
y2=floor(max(Y1,Y2));
y1=ceil(min(Y1,Y2));
printf("%lld\n",y2-y1+);
continue;
}
if(y1==y2)//如果这条线是一条水平的线
{
if(y1%!=){//如果此时的直线l:y=c,c不是整数,那么这条线上显然也没有整点
printf("0\n");
continue;
}
x2=floor(max(X1,X2));
x1=ceil(min(X1,X2));
printf("%lld\n",x2-x1+);
continue;
}
ll a=(y2-y1)*,b=(x1-x2)*,c=x1*y2-x2*y1;//计算出l:ax+by=c
ll x,y,d;
if(X2<X1) swap(X2,X1);//确保x2>x1
x1=ceil(X1),x2=floor(X2);
if(x1>x2){//如果一条线的斜率过大,使得x1,x2有m<x1<x2<m+1 (m为整数),那么显然这个范围内没有整点
printf("0\n");
continue;
}
ll k=;
exgcd(a,b,d,x,y);//得到满足ax+by=gcd(a,b)的(x0,y0)
if (c%d==)//如果c是gcd(a,b)的整数倍,即c = k * gcd(a,b),那么显然点( k * x0 , k * y0 )是ax+by=c上的一个整点
{
a/=d,b/=d;
x*=c/d,y*=c/d;
if(b<) b=-b;
x=x-(x-x1)/b*b;
while(x<x1) x+=b;
while(x+k*b<=x2) k++;
printf("%lld\n",k);
}
else printf("0\n");
}
return ;
}

UVA 11768 - Lattice Point or Not的更多相关文章

  1. UVA 11768 - Lattice Point or Not(数论)

    UVA 11768 - Lattice Point or Not option=com_onlinejudge&Itemid=8&page=show_problem&categ ...

  2. UVA 11768 Lattice Point or Not(扩展欧几里德)

    将直线转化为ax + by = c的形式,然后扩展欧几里得求在[x1, x2]之间的解 对直线与坐标轴平行的特判 调试了好长时间,注意: 1 正负数转化为整型的处理 2 注意判断有无解 #includ ...

  3. UVA - 11768 Lattice Point or Not (扩展欧几里得)

    求一条线段上有多少个整点. 是道扩欧基础题,列出两点式方程,然后分四种情况讨论即可.但细节处理较多很容易写挫(某zzWA了十几发才过掉的). 由于数据精度较小,浮点数比较没有用eps,直接==比较了. ...

  4. Lattice Point or Not UVA - 11768(拓展欧几里得)

    原文地址:https://www.cnblogs.com/zyb993963526/p/6783532.html 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB ...

  5. UVA - 1602 Lattice Animals (暴力+同构判定)

    题目链接 题意:求能放进w*h的网格中的不同的n连通块个数(通过平移/旋转/翻转后相同的算同一种),1<=n<=10,1<=w,h<=n. 刘汝佳的题真是一道比一道让人自闭.. ...

  6. uva 11768

    // 扩展欧几里得算法 // 先求出一个解 再求出区间 [x1,x2]有几个整数符合条件// 需要注意的是 水平和垂直2种情况的处理 还有正数和负数取整的细微差别#include <iostre ...

  7. UVA 1602 Lattice Animals

    题目 输入n.w.h($1\leqslant n \leqslant 10, 1\leqslant w,h \leqslant n$),求能放在w*h网格里的不同的n连块的个数(注意,平移.旋转.翻转 ...

  8. UVa 11768 格点判定(扩展欧几里得求线段整点)

    https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后 ...

  9. UVa 1602 Lattice Animals (STL && 生成n连块 && 无方向形状判重)

    题意 : 给定一个 w * h 的 矩阵,在矩阵中找不同n个连通块的个数(旋转,翻转,平移算作一种) 分析 : 这题的关键点有两个 ① 生成n连块并且存储起来(因为题目是多测试用例,如果每一次都重新生 ...

随机推荐

  1. SpringMVC由浅入深day01_8springmvc和mybatis整合

    8 springmvc和mybatis整合 为了更好的学习 springmvc和mybatis整合开发的方法,需要将springmvc和mybatis进行整合. 整合目标:控制层采用springmvc ...

  2. Centos6.3 下使用 Tomcat-6.0.43 非root用户 部署 生产环境 端口转发方式

    一.安装JDK环境 方法一. 官方下载链接 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260 ...

  3. MyEclipse weblogic Deploy Location项目名称不正确解决方案

    MyEclipse weblogic Deploy Location项目名称不正确 MyEclipse部署weblogic 项目,名称错误,是别的项目名称 ====================== ...

  4. iOS开发--打印NSRange,CGRect等结构体

    使用对应的转换NSStringFromCGPoint   NSStringFromCGSize   NSStringFromCGRect  NSStringFromCGAffineTransform  ...

  5. Git 学习笔记--3.EGit使用手册

    zz http://blog.csdn.net/pandakong/article/details/7234974 EGit是Eclipse上的Git插件,官方内容参看http://wiki.ecli ...

  6. U3D调用7z解压文件

    using UnityEngine; using System; using System.IO; using System.Diagnostics; public class Test : Mono ...

  7. 适配器模式(PHP实现)

    [目的]:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作 [主要角色]目标(Target)角色:定义客户端使用的与特定领域相关的 ...

  8. 从0开始:Windows内核利用的另一种方式

    https://www.anquanke.com/post/id/91063 从0开始:Windows内核利用的另一种方式 阅读量    9168 |   稿费 200   分享到: 发布时间:201 ...

  9. EXCEL数据匹配:The 'Microsoft.Jet.Oledb.4.0' provider is not registered on the local machin

    百度的处理结果: 作者:LisenYang http://blog.csdn.net/lisenyang/article/details/52106492 这篇博文里面说的,默认设置修改[启动32应用 ...

  10. 树莓派3b配置耳机音频输出

    耳机输出 amixer cset numid=3 1 然后,播放既可,有杂音. hdmi输出 amixer cset numid=3 2