UVA 11768 - Lattice Point or Not
首先本题需要用到扩展欧几里得算法……
关于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的更多相关文章
- UVA 11768 - Lattice Point or Not(数论)
UVA 11768 - Lattice Point or Not option=com_onlinejudge&Itemid=8&page=show_problem&categ ...
- UVA 11768 Lattice Point or Not(扩展欧几里德)
将直线转化为ax + by = c的形式,然后扩展欧几里得求在[x1, x2]之间的解 对直线与坐标轴平行的特判 调试了好长时间,注意: 1 正负数转化为整型的处理 2 注意判断有无解 #includ ...
- UVA - 11768 Lattice Point or Not (扩展欧几里得)
求一条线段上有多少个整点. 是道扩欧基础题,列出两点式方程,然后分四种情况讨论即可.但细节处理较多很容易写挫(某zzWA了十几发才过掉的). 由于数据精度较小,浮点数比较没有用eps,直接==比较了. ...
- Lattice Point or Not UVA - 11768(拓展欧几里得)
原文地址:https://www.cnblogs.com/zyb993963526/p/6783532.html 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB ...
- UVA - 1602 Lattice Animals (暴力+同构判定)
题目链接 题意:求能放进w*h的网格中的不同的n连通块个数(通过平移/旋转/翻转后相同的算同一种),1<=n<=10,1<=w,h<=n. 刘汝佳的题真是一道比一道让人自闭.. ...
- uva 11768
// 扩展欧几里得算法 // 先求出一个解 再求出区间 [x1,x2]有几个整数符合条件// 需要注意的是 水平和垂直2种情况的处理 还有正数和负数取整的细微差别#include <iostre ...
- UVA 1602 Lattice Animals
题目 输入n.w.h($1\leqslant n \leqslant 10, 1\leqslant w,h \leqslant n$),求能放在w*h网格里的不同的n连块的个数(注意,平移.旋转.翻转 ...
- UVa 11768 格点判定(扩展欧几里得求线段整点)
https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后 ...
- UVa 1602 Lattice Animals (STL && 生成n连块 && 无方向形状判重)
题意 : 给定一个 w * h 的 矩阵,在矩阵中找不同n个连通块的个数(旋转,翻转,平移算作一种) 分析 : 这题的关键点有两个 ① 生成n连块并且存储起来(因为题目是多测试用例,如果每一次都重新生 ...
随机推荐
- 8 -- 深入使用Spring -- 3...1 Resource实现类ClassPathResource
8.3.1 Resource实现类------ClassPathResource : 访问类加载路径下的资源的实现类 2.访问类加载路径下的资源 ClassPathResource 用来访问类加载路径 ...
- NetBpm 测试篇(3)
http://www.netbpm.org/movie/holiday/holiday.html
- 个人成长|荣获CNVD年度最有价值漏洞奖
本文共750+字,预计阅读2-3分钟. 前几天,很荣幸受主办方邀请,还拿了CNVD的一个“年度最有价值漏洞奖”,说一说,这几天的故事吧. 11月20号,意外收到一个会议邀请,当时还比较诧异,印象中我在 ...
- ARM9通过NFS挂载根文件系统
当开发板启动以后可以通过在超级终端发送命令来配置NFS. 首先得给开发板一个IP地址,用下面的命令配置即可: #ifconfig 192.168.0.10 经过上面的配置以后在各自的终端中应该都能PI ...
- AutoLayout深入浅出五[UITableView动态高度]
本文转载至 http://grayluo.github.io//WeiFocusIo/autolayout/2015/02/01/autolayout5/ 我们经常会遇到UITableViewCell ...
- 【Java并发编程二】同步容器和并发容器
一.同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector.HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并 ...
- 《转载》脚本实现从客户端服务端HTTP请求快速分析
本文转载自https://www.imooc.com/article/14107 首先我想介绍下,分享这个脚本的用处: 当客户告知我们,一个页面http://www.xxx.com 有问题时,作为PE ...
- IOS多线程之序
版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们开发的应用基本上都是多线程的,几乎没有不是多线程的应用发布在appstore.首先我们的应用启动会默认有一个主线程,你一直在里面执行很多操作 ...
- WP8.1学习系列(第二十五章)——控件样式
XAML 框架提供许多自定义应用外观的方法.通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visua ...
- QWidget编写的安卓app
最近为了配套人脸识别的整套设备去检测,特意做了个机关控制app,需要现场修改前端设备和服务器设备的一些参数以便进行检测.qt做一些简单的app还是非常方便的.特意增加了禁用屏保功能.apk文件体验:h ...