题意:一个人在坐标A,要前往坐标B的位置。可以往左或往右走a,b,a+b个单位,求到达B的最小步数。

分析:扩展欧几里得算法求解线性方程的套路不变。令C=fabs(A-B),c = a+b, 扩展gcd分别求 ax+by=C ; ax+cy = C : bx+cy = C的最小|x|+|y|。求min{|x|+|y|}需要一点思考。

对于线性方程ax+by=c,设d = gcd(a,b) ,若方程有解,则必须d | c,特解为 (x0,y0) = ( xx*c/d,yy*c/d) 。设am = a/d, bm = b/d。

此时方程的通解为 x = x0+ k*bm ; y = y0 - k*am。则需要求的是 res = min{ |x0 + k*bm| + |y0 - k*am| }。

设直线L1:y1 = x0 + bm*k ; L2:y2 = y0 - am*k。

则|y1|+|y2| 的最小值一定出现在y1=0或y2=0,即k1=-x0/bm 或 k2 = y0/am 时(数形结合),但由于k是整数,所以不一定y1、y2能取到0。所以枚举区间[-x0/bm-1, -x0/bm+1]和[y0/am -1 , y0/am +1]的 k 对应值中的最小值。

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
typedef long long LL;
const int maxn = 1e5+; LL ABS(LL a)
{
return a>=?a :-a;
} LL Exgcd(LL a,LL b,LL &x,LL &y ) {
if ( b == ) {
x = ;
y = ;
return a;
}
LL d = Exgcd(b, a%b, x, y), temp = x;
x = y;
y = temp-a/b*y;
return d;
} LL gao(LL a,LL b,LL c) //ax+by=c
{
LL x,y;
LL d = Exgcd(a,b,x,y);
if(c%d) return -;
LL am = a/d, bm = b/d;
x *=c/d, y*= c/d; //特解
LL ans= ABS(x)+ABS(y);
for(int i=-x/bm-;i<=-x/bm+;i++){
LL X=x+bm*i;
LL Y=y-am*i;
if(i){
LL tmp=ABS(X)+ABS(Y);
if(tmp<ans) ans=tmp;
}
}
for(int i=y/am-;i<=y/am+;i++){
LL X=x+bm*i;
LL Y=y-am*i;
if(i){
LL tmp=ABS(X)+ABS(Y);
if(tmp<ans) ans=tmp;
}
}
return ans;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
LL a,b,A,B,k;
int T; scanf("%d",&T);
while(T--){
scanf("%lld %lld %lld %lld",&A, &B, &a, &b);
LL C = ABS(A-B),c = a+b;
LL t1 =gao(a,b,C), t2 = gao(a,c,C) ,t3 = gao(b,c,C);
if(t1==- && t2==- && t3==-){
puts("-1");
continue;
}
LL ans=;
if(t1!=-) ans = min(t1,ans);
if(t2!=-) ans = min(t2,ans);
if(t3!=-) ans = min(t3,ans);
printf("%lld\n",ans);
}
return ;
}

ZOJ - 3593 One Person Game (扩展欧几里得)的更多相关文章

  1. ZOJ 3593.One Person Game-扩展欧几里得(exgcd)

    智障了,智障了,水一水博客. 本来是个水题,但是for循环遍历那里写挫了... One Person Game Time Limit: 2 Seconds      Memory Limit: 655 ...

  2. ZOJ 3593 One Person Game(拓展欧几里得求最小步数)

    One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple ...

  3. ZOJ 3609 Modular Inverse(扩展欧几里得)题解

    题意:求乘法逆元最小正正数解 思路:a*x≡1(mod m),则称x 是 a 关于 m 的乘法逆元,可以通过解a*x + m*y = 1解得x.那么通过EXGcd得到特解x1,最小正解x1 = x1 ...

  4. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C.Ray Tracing (模拟或扩展欧几里得)

    http://codeforces.com/contest/724/problem/C 题目大意: 在一个n*m的盒子里,从(0,0)射出一条每秒位移为(1,1)的射线,遵从反射定律,给出k个点,求射 ...

  5. UVA 12169 Disgruntled Judge 枚举+扩展欧几里得

    题目大意:有3个整数 x[1], a, b 满足递推式x[i]=(a*x[i-1]+b)mod 10001.由这个递推式计算出了长度为2T的数列,现在要求输入x[1],x[3],......x[2T- ...

  6. UVA 10090 Marbles 扩展欧几里得

    来源:http://www.cnblogs.com/zxhl/p/5106678.html 大致题意:给你n个球,给你两种盒子.第一种盒子每个盒子c1美元,可以恰好装n1个球:第二种盒子每个盒子c2元 ...

  7. POJ 1061 青蛙的约会 扩展欧几里得

    扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...

  8. 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

    Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...

  9. poj 2891 扩展欧几里得迭代解同余方程组

    Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...

随机推荐

  1. Meter and pixel units in a box2d game - LibGDX

    http://pimentoso.blogspot.com/2013/01/meter-and-pixel-units-in-box2d-game.html 需FQ ————————————————— ...

  2. 响应式网页设计:rem、em设置网页字体大小自适应

    「rem」是指根元素(root element,html)的字体大小,好开心的是,从遥远的 IE6 到版本帝 Chrome 他们都约好了,根元素默认的 font-size 都是 16px.这样一个新的 ...

  3. Docker 和一个正常的虚拟机有何区别?

    问: 我多次重读Docker.io文档,希望搞明白Docker.io和一个完全的虚拟机的区别.Docker是如何做到提供一个完整的文件系统,独立的网络环境等等这些功能,同时还没有如此庞大? 为什么部署 ...

  4. 第6步:检查grid安装环境

    6.1 检查系统包 grid 身份下校验安装环境(检测crs安装环境(sgdb1)) [root@node1 soft]#su – grid [grid@node1 ~]$ cd /soft/grid ...

  5. Chem 3D软件可以改变背景吗

    化学绘图过程中常常需要绘制三维结构的图形,Chem 3D软件是ChemOffice套件中专门用于绘制三维结构的组件.用过它的用户会发现,其背景颜色通常都默认为深蓝色,但是不是每个场景都适合用深蓝色的背 ...

  6. Python_selenium之获取当前页面的href属性,id属性,图片信息和截全屏

    Python_selenium之获取当前页面的href属性,id属性,图片信息和截全屏 一.  获取当前页面的全部信息 1. 图片信息包括图片名称.图片大小等信息 2. 只需将图片信息打印出来(ima ...

  7. Amazon【EC2】如何启动一个新的EC2实例

    1.1 控制台可直接搜索ec2 1.2 创建实例 aws没有新建实例这个说法,新建就是启动实例 1.3 选择镜像 在搜索框中搜索自己想要的镜像.这里有收费的也有免费的 1.4 选择实例类型 选择自己想 ...

  8. Windows 8.1 浏览器中 SkyDrive 的改名与隐藏

    在 Windows 8.1 中已经整合了 SkyDrive ,在中文版中 SkyDrive 的名字总是感觉不协调,可是在属性里面可以调整位置却不能修改名称,怎么办呢? 打开注册表,找到 HKEY_CL ...

  9. 62、常规控件(5)Navigation View –美观的侧滑视图

    1.main_layout.xml <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.andr ...

  10. 【BZOJ4870】[Shoi2017]组合数问题 动态规划(矩阵乘法)

    [BZOJ4870][Shoi2017]组合数问题 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < ...