UVA - 11768 Lattice Point or Not (扩展欧几里得)
2024-08-30 07:56:39
求一条线段上有多少个整点。
是道扩欧基础题,列出两点式方程,然后分四种情况讨论即可。但细节处理较多很容易写挫(某zzWA了十几发才过掉的)。
由于数据精度较小,浮点数比较没有用eps,直接==比较了。
#include<bits/stdc++.h> using namespace std;
typedef long long ll; void exgcd(ll a,ll b,ll& x,ll& y,ll& g) {
if(!b)x=,y=,g=a;
else exgcd(b,a%b,y,x,g),y-=x*(a/b);
} ll solve(double x1,double y1,double x2,double y2) {
if(x1>x2||(x1==x2&&y1>y2))swap(x1,x2),swap(y1,y2);
if(x1==x2&&y1==y2) {
if(x1==round(x1)&&x2==round(x2))return ;
else return ;
} else if(x1==x2) {
if(x1==round(x1))return floor(y2)-ceil(y1)+;
else return ;
} else if(y1==y2) {
if(y1==round(y1))return floor(x2)-ceil(x1)+;
else return ;
} else {
ll a=round((y2-y1)*),b=round((x1-x2)*),c=round((y2*x1-y1*x2)*);
ll x,y,g;
exgcd(a,b,x,y,g);
if(c%g==) {
x*=c/g;
ll bb=abs(b/g);
ll xl=ceil(x1),xr=floor(x2);
ll xll=x+(xl-x)/bb*bb;
ll xrr=x+(xr-x)/bb*bb;
if(xll<xl)xll+=bb;
if(xrr>xr)xrr-=bb;
return max(0ll,(xrr-xll)/bb+);
} else return ;
}
} int main() {
ll T;
scanf("%lld",&T);
while(T--) {
double x1,y1,x2,y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
printf("%lld\n",solve(x1,y1,x2,y2));
}
return ;
}
最新文章
- 谢欣伦 - OpenDev原创例程 - 网络摄像机WebCamera
- cxf 调用 webservice服务时传递 服务器验证需要的用户名密码
- VMware-workstation-full-11.0.0-2305329&;VMware-player-7.0.0-2305329
- 每天一个 Linux 命令(15):tail 命令
- Atiti &#160;attilax主要成果与解决方案与案例rsm版 v4
- python学习笔记4(文件操作)
- Android系统中Parcelable和Serializable的区别
- .NET自动识别HttpWebResponse的编码及是否压缩
- input onfocus onblur
- ADLINK 8158控制程序-连续运动(VB.NET)
- JS跨域请求之JSONP
- SSM框架整合,以CRM为例子
- web开发简史与技术选型
- Java框架spring 学习笔记(十一):aop相关概念
- 关于iOS设备的那些事
- centos7中docker操作
- java 多线程研究:锁的概念
- Ansible6:Playbook简单使用
- Node.js系列——(4)优势及场景
- mb_strlen(,utf-8);可以除去中文字符,统一返回是几个字符