[数论]ZOJ3593 One Person Game
题意:一个人要从A走到B 只能走a布、b步、(a+b)步,可以往左或右走
问 最少要走几步,不能走到的输出-1
可以列出方程 $ax+by=A-B$
或者 $ax+(a+b)y=A-B$
或者 $bx+(a+b)y=A-B$
要取这三个方程的最小的$(x+y)$
根据$ax+by=gcd(a, b) $
当$A-B$不是$gcd$的倍数时 就不能走到
利用ex_gcd可以分别求出这三个方程的解,但求出的这组并非最小的
因此利用枚举斜率 得到的交点为最小的一组解
LL exgcd(LL a,LL b,LL &x,LL &y)
{
LL d=a;
if(b!=)
{
d=exgcd(b,a%b,y,x);
y-=(a/b)*x;
}
else x=,y=;
return d;
}
LL Abs(LL x)
{
return x<? -x:x;
}
LL A;
LL gao(LL a, LL b)
{
LL x, y;
LL g=exgcd(a, b, x, y);
x=x*(A/g), y=y*(A/g);
a/=g, b/=g; LL ans=Abs(x)+Abs(y);
for(int i=-;i<;i++)
ans=min(ans, Abs(x+(-x/b+i)*b)+Abs(y-(-x/b+i)*a));
for(int i=-;i<;i++)
ans=min(ans, Abs(x+(y/a+i)*b)+Abs(y-(y/a+i)*a));
return ans;
}
int main()
{
int t;
LL B,a,b;
cin>>t;
while(t--)
{
cin>>A>>B>>a>>b;
A=Abs(A-B);
if(!A)
{
puts("");
continue;
}
if(A%__gcd(a, b))
{
puts("-1");
continue;
}
cout<<min(gao(a, b), min(gao(a+b, a), gao(a+b, b)))<<endl;
}
return ;
}
ZOJ 3593
[数论]ZOJ3593 One Person Game的更多相关文章
- Codeforces Round #382 Div. 2【数论】
C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...
- NOIP2014 uoj20解方程 数论(同余)
又是数论题 Q&A Q:你TM做数论上瘾了吗 A:没办法我数论太差了,得多练(shui)啊 题意 题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, ...
- 数论学习笔记之解线性方程 a*x + b*y = gcd(a,b)
~>>_<<~ 咳咳!!!今天写此笔记,以防他日老年痴呆后不会解方程了!!! Begin ! ~1~, 首先呢,就看到了一个 gcd(a,b),这是什么鬼玩意呢?什么鬼玩意并不 ...
- hdu 1299 Diophantus of Alexandria (数论)
Diophantus of Alexandria Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)
4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 290 Solved: 148[Submit][Status ...
- bzoj2219: 数论之神
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- hdu5072 Coprime (2014鞍山区域赛C题)(数论)
http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出N个数,求有多少个三元组,满足三个数全部两两互质或全部两两不互质. 题解: http://dty ...
- ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德
POJ 1061 青蛙的约会 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & %llu Descr ...
- 数论初步(费马小定理) - Happy 2004
Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2 ...
随机推荐
- C#学习笔记之线程 - 通知Signal
通知事件等待句柄 Signal With EventWaitHandle 事件等待句柄常用于通知.当一个线程等待直到接收到另外一个线程发出的信号.事件等待句柄是最简单的信号结构,它与C#事件无关.有三 ...
- 【leetcode】365. Water and Jug Problem
题目描述: You are given two jugs with capacities x and y litres. There is an infinite amount of water su ...
- java集合 collection-list-ArrayList 去除ArrayList集合中的重复元素。
import java.util.*; /* 去除ArrayList集合中的重复元素. */ class ArrayListTest { public static void sop(Object o ...
- [Guava学习笔记]Collections: 不可变集合, 新集合类型
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3843386.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- Hadoop示例程序WordCount编译运行
首先确保Hadoop已正确安装及运行. 将WordCount.java拷贝出来 $ cp ./src/examples/org/apache/hadoop/examples/WordCount.jav ...
- BroadcastReceiver
BroadcastReceiver 广播接受者 Android中, Broadcast是一种数据传递的方式/通信方式. Brodadcast 是Android 系统组件之一 广播的特性 1. 由一个发 ...
- python学习之socket创建html服务器
#coding:utf-8 import socket def process_request(request): request.recv(1024)#读取接受的字节 request.send(&q ...
- shell脚本编程之for语句、if语句使用介绍
介绍了shell脚本编程之for语句.if语句的使用方法. 上部: 面向过程: 顺序执行 选择执行: if, case 循环执行: for, while, until 一.for语句 格式: ...
- RFC822DateGMT
function RFC822DateGMT(dd: TDateTime): string; const Days:..] of string= ('Sun','Mon','Tue','Wed','T ...
- Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解
Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...