Lattice Point or Not UVA - 11768(拓展欧几里得)
原文地址:https://www.cnblogs.com/zyb993963526/p/6783532.html
题意:
给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍。统计选段AB穿过多少个整点。
思路:
做了这道题之后对于扩展欧几里得有了全面的了解。
根据两点式公式求出直线
,那么ax+by=c 中的a、b、c都可以确定下来了。
接下来首先去计算出一组解(x0,y0),因为根据这一组解,你可以写出它的任意解
,其中
,K取任何整数。
需要注意的是,这个 a' 和 b' 是很重要的,比如说 b' ,它代表的是x每隔 b' ,就会出现一个整点。
所以这道题目的关键就是,我们先求出一组解,然后通过它的 b' 将x0改变成x,使得x在[x1,x2]区间之内,这样每 b' 个单位就有一个整点了,即
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std; typedef long long LL;
double X1,Y1,X2,Y2; void gcd(LL a,LL b,LL& d,LL& x,LL& y)
{
if(!b) {d=a;x=;y=;}
else { gcd(b,a%b,d,y,x); y-=x*(a/b);}
} LL solve()
{
LL x1=X1*, y1=Y1*, x2=X2*, y2=Y2*;
if(x1==x2) //平行y轴
{
if(x1%) return ; //原来的X1为小数,肯定不是整点
if(Y2<Y1) swap(Y1,Y2);
return floor(Y2)-ceil(Y1)+;
}
if(y1==y2)
{
if(y1%) return ;
if(X2<X1) swap(X1,X2);
return floor(X2)-ceil(X1)+;
}
LL a=(y2-y1)*, b=(x1-x2)*, c=y2*x1-y1*x2; //c相当于扩大了100倍,所以前面还得乘10
LL d,x,y;
gcd(a,b,d,x,y);
if(c%d) return ; //扩展欧几里得算法无解的判断 x=x*c/d; y=y*c/d; //获得一组整数解(x,y)
b=abs(b/d); //这里的b其实就是b' if(X1>X2) swap(X1,X2);
x1=ceil(X1);
x2=floor(X2);
if(x1>x2) return ; x=x+(x1-x)/b*b; //使x进入[x1,x2]的区间内
if(x<x1) x+=b;
if(x>x2) return ;
return (x2-x)/b+;
} int main()
{
//freopen("D:\\input.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf%lf",&X1,&Y1,&X2,&Y2);
LL ans = solve();
printf("%lld\n",ans);
}
return ;
}
思路:
做了这道题之后对于扩展欧几里得有了全面的了解。
根据两点式公式求出直线
,那么ax+by=c 中的a、b、c都可以确定下来了。
接下来首先去计算出一组解(x0,y0),因为根据这一组解,你可以写出它的任意解
,其中
,K取任何整数。
需要注意的是,这个 a' 和 b' 是很重要的,比如说 b' ,它代表的是x每隔 b' ,就会出现一个整点。
所以这道题目的关键就是,我们先求出一组解,然后通过它的 b' 将x0改变成x,使得x在[x1,x2]区间之内,这样每 b' 个单位就有一个整点了,即
Lattice Point or Not UVA - 11768(拓展欧几里得)的更多相关文章
- uva 10548 - Find the Right Changes(拓展欧几里得)
题目链接:uva 10548 - Find the Right Changes 题目大意:给定A,B,C,求x,y,使得xA+yB=C,求有多少种解. 解题思路:拓展欧几里得,保证x,y均大于等于0, ...
- UVA.12169 Disgruntled Judge ( 拓展欧几里得 )
UVA.12169 Disgruntled Judge ( 拓展欧几里得 ) 题意分析 给出T个数字,x1,x3--x2T-1.并且我们知道这x1,x2,x3,x4--x2T之间满足xi = (a * ...
- NOIP2012拓展欧几里得
拉板题,,,不说话 我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了 先来一发欧几里得拓展裸 #include <cstdio> void gcd ...
- poj 1061 青蛙的约会 拓展欧几里得模板
// poj 1061 青蛙的约会 拓展欧几里得模板 // 注意进行exgcd时,保证a,b是正数,最后的答案如果是负数,要加上一个膜 #include <cstdio> #include ...
- bzoj4517: [Sdoi2016]排列计数--数学+拓展欧几里得
这道题是数学题,由题目可知,m个稳定数的取法是Cnm 然后剩下n-m本书,由于编号为i的书不能放在i位置,因此其方法数应由错排公式决定,即D(n-m) 错排公式:D[i]=(i-1)*(D[i-1]+ ...
- POJ 2891 Strange Way to Express Integers(拓展欧几里得)
Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ...
- POJ1061 青蛙的约会-拓展欧几里得
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...
- BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)
污污污污 2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2312 Solved: 917 [Submit][S ...
- BZOJ-1407 Savage 枚举+拓展欧几里得(+中国剩余定理??)
zky学长实力ACM赛制测试,和 大新闻(YveH) 和 华莱士(hjxcpg) 组队...2h 10T,开始 分工我搞A,大新闻B,华莱士C,于是开搞: 然而第一题巨鬼畜,想了40min发现似乎不可 ...
- poj2891 拓展欧几里得
//Accepted 164 KB 16 ms //拓展欧几里得 //m=a1*x+b1 --(1) //m=a2*(-y)+b2 --(2) //->a1*x+a2*y=b2-b1 //由欧几 ...
随机推荐
- VS2017 C++操作mysql数据库
1.首先安装mysql 具体教程可以参考https://blog.csdn.net/zhouzezhou/article/details/52446608 注意安装产品的时候记得选择MySQL Con ...
- ffmpeg——关于视频压缩
这篇博客主要讲有关于视频压缩的问题,解决视频文件太大,不便于下载,占用存储空间过大等问题,在缩小视频大小的同时,保证视频的观看质量.主要讲以下几点: 1.压缩视频工具ffmpeg 2.压缩视频的技术参 ...
- Spring中的数据库事物管理
Spring中的数据库事物管理 只要给方法加一个@Transactional注解就可以了 例如:
- java基础---类加载和对象创建过程
类中可以存在的成员: class A{ 静态成员变量: 非静态成员变量: 静态函数: 非静态函数: 构造函数 A(..){...} 静态代码块 static{...} 构造代码块 {...} } 类加 ...
- Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 78,050,512 milliseconds ago.
今天访问已经架上服务器的网站,报错: Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet s ...
- MySQL两种引擎的比较
MyISAM,InnoDB主要区别: 1.MyISAM是非事物安全的,InnoDB是事物安全的. 事物安全的特点为更安全,遇到问题会自动恢复或从备份加事物日志回复,如果更新失败,你的所有改变都变回原来 ...
- windows 平台安装 ffmpeg
一.从https://ffmpeg.zeranoe.com/builds/中下载ffmpeg的static版本: 二.将下载下来的“ffmpeg-4.0.2-win64-static.zip”解压到任 ...
- k8s环境搭建--基于minik8s方法
minik8s 安装 关闭selinux.开启ipv6 sudo bash selinux_ipv6.sh 下载kubectl和minikube 下载minikube,因为国外的源被墙了,所以只能用阿 ...
- Notes of Daily Scrum Meeting(11.15)
Notes of Daily Scrum Meeting(11.15) 今天周六我们的主要工作是把这周落下的一些工作补回来,这是写程序的最后阶段,准备进入测试阶段了,所以之前的工作 要补齐,今天大家的 ...
- Daily Scrum (2015/10/30)
据组员们反映其他组都会有休息时间,所以我和PM讨论把每周5晚上作为日常休息时间,这一天组员们自由阅读.