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连块并且存储起来(因为题目是多测试用例,如果每一次都重新生 ...
随机推荐
- Android图片处理(Matrix,ColorMatrix) - 转载
Android图片处理(Matrix,ColorMatrix) 转载自:http://www.cnblogs.com/leon19870907/articles/1978065.html 在编程中有时 ...
- hadoop JOB的性能优化实践
使用了几个月的hadoopMR,对遇到过的性能问题做点笔记,这里只涉及job的性能优化,没有接触到 hadoop集群,操作系统,任务调度策略这些方面的问题. hadoop MR在做大数据量分析时候有限 ...
- 处理i18n国际电话区号的代码实践
本文转载至 http://adad184.com/2015/08/18/practice-in-i18n-dialling-code/ 前言 上周在忙产品的国际化(i18n)的问题 其中一个很重要的地 ...
- VC++进行窗口枚举
https://blog.csdn.net/u012372584/article/details/53735242 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- no matching function for call to ‘std::basic_string<char>::assign(std::string&, int)
使用string中的assign赋值函数报错,代码为: text0.assign(line,i+); 其中text0与line都为string类型 最后发现assign函数的原型为 string &a ...
- 获取访客IP、地区位置信息、浏览器、来源页面
<?php //这个类似用来获取访客信息的 //方便统计 class visitorInfo { //获取访客ip public function getIp() { $ip=false; if ...
- jquery.gritter.js简介
Gritter 是一个小型的 jQuery 消息通知插件,通知效果如下图所示: 参考网
- git-常用命令一览表
一.git bash 操作文件 常用命令表 git常用 文件操作 命令 功能分类 命令 说明 备注 目录切换 cd 文件目录 改变/切换 目录, change directory 如 cd e:\ff ...
- CSS3 渐变效果
CSS3 渐变效果 background-image: -moz-linear-gradient(top, #8fa1ff, #3757fa); /* Firefox */ background-im ...
- $.format,jquery.format 使用说明
为jquery添加 format 功能 $.format = function (source, params) { if (arguments.length == 1) return functi ...