UVA 11768 Lattice Point or Not(扩展欧几里德)
将直线转化为ax + by = c的形式,然后扩展欧几里得求在[x1, x2]之间的解
对直线与坐标轴平行的特判
调试了好长时间,注意:
1 正负数转化为整型的处理
2 注意判断有无解
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<utility>
using namespace std;
typedef long long LL;
const int N = 1008, INF = 0x3F3F3F3F;
const double eps = 1e-6, meps = 1e-7;
LL Ext_gcd(LL a,LL b,LL &x,LL &y){//扩展欧几里得
if(b==0) { x=1, y=0; return a; }
LL ret= Ext_gcd(b,a%b,y,x);
y-= a/b*x;
return ret;
} LL gcd(LL a, LL b){
while(b){
LL t = a % b;
a = b;
b = t;
}
return a;
} LL cal(LL x1, LL x2, LL x, LL mod){
if(x1 > x2){
return 0;
}
if(x >= x1 && x <= x2){
return (x - x1) / mod + 1 + (x2 - x) / mod;
}
if(x < x1){
return (x2 - x) / mod - (x1 - 1 - x) / mod;
}
return (x - x1) / mod - (x - x2 - 1) / mod; }
LL toLL(double x){
if(x > 0){
return x + eps;
}
if(x < 0){
return x - eps;
}
return 0;
}
int main(){
double t1, t2, t3, t4;
int t;
scanf("%d", &t);
while(t--){
scanf("%lf %lf %lf %lf", &t1, &t2, &t3, &t4);
if(abs(t1 - t3) < eps){
if(abs(t1 - (LL)t1) < eps){
double t22 = min(t2, t4);
double t44 = max(t2, t4);
printf("%lld\n", cal((LL)ceil(t22), (LL)floor(t44), (LL)ceil(t22), 1));
}else{
printf("0\n");
}
continue;
} if(abs(t2 - t4) < eps){
if(abs(t2 - (LL)t2) < eps){
double t11 = min(t1, t3);
double t33 = max(t1, t3);
printf("%lld\n", cal((LL)ceil(t11), (LL)floor(t33), (LL)ceil(t11), 1));
}else{
printf("0\n");
}
continue;
} LL x1 = toLL(t1 * 10), y1 = toLL(t2 * 10), x2 = toLL(t3 * 10), y2 = toLL(t4 * 10); //cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<"\n"; if(x1 > x2){
swap(x1, x2);
swap(y1, y2);
}
LL a = (y2 - y1) * 10, b = (x1 - x2) * 10;
LL c = x1 * y2 - x2 * y1;
LL gc = gcd(gcd(a, b), c);
a /= gc;
b /= gc;
c /= gc; //cout<<a<<" "<<b<<" "<<c<<" ***\n";
if(c % gcd(a, b)){
printf("0\n");
continue;
} //cout<<a * t1 + b * t2 - c<<" aa\n";
//cout<<a * t3 + b * t4 - c<<" aa\n";
LL x, y;
Ext_gcd(a, b, x, y);
//cout<<x<<" "<<y<<" xy\n";
x = c / gcd(a, b) * x;
//cout<<x<<" spe\n";
if(t1 > t3){
swap(t1, t3);
}
printf("%lld\n",cal((LL)ceil(t1), (LL)floor(t3), x, abs(b / gcd(a, b))));
//cout<<tp<<" cal\n";
} return 0;
}
UVA 11768 Lattice Point or Not(扩展欧几里德)的更多相关文章
- UVA - 11768 Lattice Point or Not (扩展欧几里得)
求一条线段上有多少个整点. 是道扩欧基础题,列出两点式方程,然后分四种情况讨论即可.但细节处理较多很容易写挫(某zzWA了十几发才过掉的). 由于数据精度较小,浮点数比较没有用eps,直接==比较了. ...
- 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
首先本题需要用到扩展欧几里得算法…… 关于exgcd算法的一点简略证明: 那么,对于函数exgcd(a,b)=(d,x,y),其中d满足d=gcd(a,b); (x,y)满足ax+by=d; 则exg ...
- UVa 11768 格点判定(扩展欧几里得求线段整点)
https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后 ...
- (扩展欧几里德算法)zzuoj 10402: C.机器人
10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...
- [BZOJ1407][NOI2002]Savage(扩展欧几里德)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1407 分析: m,n范围都不大,所以可以考虑枚举 先枚举m,然后判定某个m行不行 某个 ...
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...
- 51nod 1352 扩展欧几里德
给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数. 提示: 对于第二组测试数据,集合分别 ...
- CF 7C. Line(扩展欧几里德)
题目链接 AC了.经典问题,a*x+b*y+c = 0整数点,有些忘记了扩展欧几里德,复习一下. #include <cstdio> #include <iostream> # ...
随机推荐
- git查看本地和创建分支、上传分支、提交代码到分支、删除分支等,git分支、git查看本地和创建分支以及上传分支到服务器
以下是git命令行里边的命令操作 ##进入项目目录下 giscafer@Faronsince2016 /G/002_project $ cd Comments ##查看远程分支有哪些 giscafer ...
- python 反射
python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! 反射的四个基本函数使用 hasattr,getattr,setatt ...
- App Extension访问Cocoapods引入的第三方库
步骤一: PROJECT --info --configurations,将对应的Debug和Release 设置成pods.debug和pods.release 步骤2:编译一下(本人遇到的问 ...
- shell正则表达式
正则表达式 主要用于字符串的模式分割/匹配/查找及替换操作. 正则表达式与通配符 通配符 正则与通配符的区别: 正则匹配字符串,通配符匹配文件名. 正则--->包含匹配 通配符--->完全 ...
- 在QtCreator中使用doxygen
接触Doxygen后,认识到其强大之处,一口气将之前的烂代码重构了一遍,所有的文件头,函数注释等等都是手动添加注释.在keil中可以看到其对JavaDoc风格的注释有高亮,非常好看.但是keil这个I ...
- SQL Server 2016 RC0 安装(超多图)
微软最新版本的数据库SQL Server 2016在2016年3月9日推出了RC0版本.已经提供了包括简体中文等多种语言版本,不过联机丛书还是英文版的.对OS的要求是WIN8,WIN10, WIN20 ...
- MySQL收藏
MySQL手册:5.5手册 .5.6手册 cd /usr/local/mysql/bin mysql -uroot -p show processlist; // 显示系统中正在运行的所有进程 M ...
- RecyclerView各种报错
昨天有人提到RecyclerView,于是我就照着官方的文档研究了下使用方法,结果发现示例代码有问题真是醉. 自己修改后编译是没有问题的但是运行的时候总是报错,大意就是提示找不到RecyclerVie ...
- CSS3学习基本记录
CSS3 边框 border-radius: 圆角 border-radius: 15px 50px 70px 100px; 左上 右上 右下 左下 box-shadow:阴影 box-shadow: ...
- WinForm各种API---时时更新
好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3 0 0 本文原文地址:http://www.cnblogs.com/hqxc/p/6160685.html 徐淳 [D ...