原题传送门

题目描述

Winy是一家酒吧的老板,他的酒吧提供两种体积的啤酒,a ml和b ml,分别使用容积为a ml和b ml的酒杯来装载。

酒吧的生意并不好。Winy发现酒鬼们都非常穷。有时,他们会因为负担不起aml或者bml啤酒的消费,而不得不离去。因此,Winy决定出售第三种体积的啤酒(较小体积的啤酒)。

Winy只有两种杯子,容积分别为a ml和b ml,而且啤酒杯是没有刻度的。他只能通过两种杯子和酒桶间的互相倾倒来得到新的体积的酒。

为了简化倒酒的步骤,Winy规定:

(1)a≥b;

(2)酒桶容积无限大,酒桶中酒的体积也是无限大(但远小于桶的容积);

(3)只包含三种可能的倒酒操作:

①将酒桶中的酒倒入容积为b ml的酒杯中;

②将容积为a ml的酒杯中的酒倒入酒桶;

③将容积为b ml的酒杯中的酒倒入容积为a ml的酒杯中。

(4)每次倒酒必须把杯子倒满或把被倾倒的杯子倒空。

Winy希望通过若干次倾倒得到容积为a ml酒杯中剩下的酒的体积尽可能小,他请求你帮助他设计倾倒的方案

输入格式

两个整数a和b(0<b≤a≤10^9)

输出格式

第一行一个整数c,表示可以得到的酒的最小体积。

第二行两个整数Pa和Pb(中间用一个空格分隔),分别表示从体积为a ml的酒杯中倒出酒的次数和将酒倒入体积为b ml的酒杯中的次数。

若有多种可能的Pa、Pb满足要求,那么请输出Pa最小的一个。若在Pa最小的情况下,有多个Pb满足要求,请输出Pb最小的一个。

输入输出样例

输入 #1

5 3

输出 #1

1
1 2

说明/提示

样例解释:倾倒的方案为:

1、桶->B杯;2、B杯->A杯;

3、桶->B杯;4、B杯->A杯;

5、A杯->桶; 6、B杯->A杯;

------------------------------------------------以下为题解部分-----------------------------------------------

分析:

首先看完这个题,我瞬间想到了我小学时做的奥数题。。。。。。
然后我翻了翻,发现没有做错题。。。。。。

咳咳,进入正题:

这个题首先基本没有什么思路,按照以往的做法,我们模拟一下数据+自造数据找规律。

事实证明,完全是可以的。

这个题的考点就是数论(gcd,exgcd)

什么gcd,exgcd具体做法其余dalao们已经讲的很清楚了,我这个蒟蒻简单叨叨几句:

拓展欧几里得算法:

一定存在整数a,b,使得ax+by=(x,y)

欧几里得算法:gcd(x,y)->gcd(y,x%y)

gcd(x,y)->gcd(y,x-⌊x/y⌋*y)

如果已知a’y+b’(x- ⌊x/y⌋ *y)=(x,y)

整理得b’x+(a’-b’⌊x/y⌋)y=(x,y)

最底层:x’=(x,y) y’=0

显然有1x’+0y’=(x,y)

于是可以递归求出a,b

拓展欧几里得算法告诉我们x与y的线性组合的取值可以是(x,y),那么自然(x,y)的整数倍也能够被取到。/

Thm: x与y的线性组合能且仅能取(x,y)的整数倍

那线性组合又是什么?

Def:∀a,b∈Z ax+by为x与y的一个线性组合

那么x与y的线性组合可能取到哪些值?

设k=(x,y), p=ax+by

p=k(ax/k+by/k)

p是k的整数倍!

x与y的线性组合的取值只能是x与y的gcd的整数倍

话不多说,上代码:

#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<iostream>
#define LL long long    //比较懒。。。。
using namespace std;
LL exgcd(LL x,LL y,LL &a,LL &b)     //扩展欧几里得的核心算法
{
    if(y==0) {a=1;b=0;return x;}
    LL aa,bb,ans;
    ans=exgcd(y,x%y,aa,bb);
    a=bb;
    b=aa-bb*(x/y);
    return ans;
}
int main()
{
    LL a,b,pa,pb,g;
    cin>>a>>b;
    g=exgcd(a,b,pa,pb); //一轮exgcd操作
    a/=g;b/=g;
    LL t=pa/b;
    pa-=t*b;pb+=t*a;
    while(pa>0) pa-=b,pb+=a;    //处理最小值
    while(pa-b>=0) pa-=b,pb+=a;//(同上)
    cout<<g<<endl<<-pa<<' '<<pb;
    return 0;
}

最后默默吐槽:格式错误3次,我WA声都要听烦了。。。。

洛谷题解 P1292 【倒酒】的更多相关文章

  1. 洛谷——P1292 倒酒

    P1292 倒酒 题目描述 Winy是一家酒吧的老板,他的酒吧提供两种体积的啤酒,a ml和b ml,分别使用容积为a ml和b ml的酒杯来装载. 酒吧的生意并不好.Winy发现酒鬼们都非常穷.有时 ...

  2. P1292 倒酒

    P1292 倒酒这个题有很多模型,这个是一个变形.我令一个解为x两个整数Pa和Pb,分别表示从体积为a ml的酒杯中倒出酒的次数和将酒倒入体积为b ml的酒杯中的次数(酒杯一开始为空).b最后是0,所 ...

  3. 洛谷 P1292 倒酒

    题目描述 Winy是一家酒吧的老板,他的酒吧提供两种体积的啤酒,a ml和b ml,分别使用容积为a ml和b ml的酒杯来装载. 酒吧的生意并不好.Winy发现酒鬼们都非常穷.有时,他们会因为负担不 ...

  4. 洛谷 题解 UVA572 【油田 Oil Deposits】

    这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...

  5. 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)

    必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...

  6. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  7. 洛谷 题解 P5534 【【XR-3】等差数列】

    我又双叒叕被包菜辣! 题目 这道题是不久前的考试题,现在来水一篇题解 扯回正题 题目很明显的告诉你了,这是一个等差数列, 然后,还告诉你了首项, 第二项, 项数. 你还想咋滴 告诉了你首项和第二项,相 ...

  8. 洛谷题解 CF777A 【Shell Game】

    同步题解 题目翻译(可能有童鞋没读懂题面上的翻译) 给你三张牌0,1,2. 最初选一张,然后依次进行n次交换,交换规则为:中间一张和左边的一张,中间一张和右边一张,中间一张和左边一张...... 最后 ...

  9. 洛谷题解 CF807A 【Is it rated?】

    同步题解 题目 好吧,来说说思路: 1.先读入啦~(≧▽≦)/~啦啦啦 2.判断a[i]赛前赛后是否同分数,如果分数不同,则输出,return 0 . 3.如果同分数,则判断a[i]赛前(或赛后)是否 ...

随机推荐

  1. java8 stream按对象多个属性对集合进行分组,并进行组装数据

    如图,数据库查出来的数据: 需求是按menu_id和menu_name分组,stream实现最简单, stream里面只有按一个属性分组的,但是可以利用string简单变换一下: List<Js ...

  2. qt creator源码全方面分析(2)

    目录 doc文件夹 帮助文档 qdoc工具 doxygen工具 qtcreator.qdocconf qtcreator-dev.qdocconf doc文件夹 对于bin和dist文件夹这里就不做过 ...

  3. TCP UDP协议的三次握手

    接触网络协议栈TCP/IP的人,就一定绕不开的一个话题就是TCP的三次握手.下面我将简单介绍一下. 三次握手流程的本质,可以这么理解:TCP的三次握手其实是双方各一次握手,各一次确认,只是其中一次握手 ...

  4. ubuntu 14.04 安装wordpress

    转者注:若没有Apache + PHP + MySQL环境,请参考我的这篇博客 (1)首先下载wordpress, sudo wget http://wordpress.org/latest.tar. ...

  5. 练习:等待用户输入input()

    等待用户输入 执行下面的程序在按回车键后就会等待用户输入: 实例(Python 3.0+) #!/usr/bin/python3 input("\n\n按下 enter 键后退出." ...

  6. HDU_3410_单调栈

    http://acm.hdu.edu.cn/showproblem.php?pid=3410 初探单调栈,从左往右,求l,从右往左,求r. #include<iostream> #incl ...

  7. 2019牛客多校2 H Second Large Rectangle(悬线法)

    题意: 求第二大子矩形 思路: 设最大子矩形x*y,第二大子矩形一定在一下情况中 (x-1)*y x*(y-1) 其他最大子矩形候选者 注意去重手法 代码: #include<iostream& ...

  8. 林大妈的JavaScript进阶知识(二):JS异步行为

    JavaScript 是单线程执行的 JavaScript运行在浏览器中.浏览器是多线程的,但只分配了其中一条给JavaScript,作为它的主线程.对于编码者来说,JavaScript是单线程的.因 ...

  9. PC微信逆向--实现消息防撤回

    自从聊天软件消息撤回功能问世后,对于撤回的消息,我们对它一直有种强烈的好奇感."Ta刚撤回了什么?是骂我的话?还是说喜欢我?还是把发给其他人的消息误发给了我?好气呀,都看不到了...&quo ...

  10. 都闪开,不用任何游戏引擎,html也能开发格斗游戏

    html格斗游戏,对打游戏 不用引擎,不用画布canvas,不用任何库(包括jquery), 原生div+img组件,开发格斗游戏游戏教程视频已经上传 b站:https://www.bilibili. ...