原题传送门

题目描述

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新特性一点通 | 回顾功能接口Functional Interface

    Functional Interface Functional Interface是什么? 功能接口是java 8中的新增功能,它们只允许一个抽象方法.这些接口也称为单抽象方法接口(SAM接口).这些 ...

  2. LoadIcon的使用

    LoadIcon msdn: Loads the specified icon resource from the executable (.exe) file associated with an ...

  3. Codeforces_794

    A.统计两个guard之间的钞票数. #include<bits/stdc++.h> #define MOD 1000000009 using namespace std; int a,b ...

  4. StackExchange.Redis 之 hash 类型示例

    StackExchange.Redis 的组件封装示例网上有很多,自行百度搜索即可. 这里只演示如何使用Hash类型操作数据: // 在 hash 中存入或修改一个值 并设置order_hashkey ...

  5. [Effective Java 读书笔记] 第二章 创建和销毁对象 第二条

    第二条 遇到多个构造器参数时,可以考虑用构建器 当遇到有多个构造器参数时,常见的是用重叠构造器,即: public class TestClass{ public TestClass(int para ...

  6. 7个有用的JS技巧

    就如其他的编程语言一样,JavaScript也具有许多技巧来完成简单和困难的任务. 一些技巧已广为人知,而有一些技巧也会让你耳目一新. 让我们来看看今天可以开始使用的七个JavaScript技巧吧! ...

  7. Waymo-自动驾驶长尾问题挑战(2019)

    尽管Waymo已经在开放道路上积累超过10 Million Miles,Waymo的工程师们仍然发现有层出不穷的新自动驾驶场景待解决. 1.自动驾驶长尾场景举例 场景一:一个骑自行车的人手中拿着一个S ...

  8. 微信小程序仿朋友圈功能开发(发布、点赞、评论等功能)

    微信小程序仿朋友圈功能开发(发布.点赞.评论等功能) 1.项目分析 项目整体分为三个部分 发布 展示 详情页 graph LR 朋友圈发布 --内容发布--> 内容展示 内容展示 --点击展示卡 ...

  9. js 细节

    1.js中var a=s=1和var a=1,s=1的区别 function fl() { ; } function fl1() { , s = ; } 看出问题所在了吗? var q=w=1 中的s ...

  10. mysql出现 Unknown column 'Password' in 'field list'

    linux安装了mysql之后初始化密码获取:出现了下面的内容,密码很尴尬,无法用root登录: grep 'temporary password' /var/log/mysqld.log [Note ...