题目意思一开始没理解,原来是 给你重为a,b,的砝码 求测出 重量为d的砝码,a,b砝码可以无限量使用

开始时我列出来三个方程 :

a*x+b*y=d;

a*x-b*y=d;

b*y-ax=d;

傻眼了,可是我们知道 x,y前面的正负符号是不影响extgcd的使用的,比如poj1061 方程式是 px+qy=m,而 nefu84方程式是:px-qy=m;

所以不影响 只是方法没有想好,后来想到了  先令ax+by=1,求解出 x,y再乘以d不就可以了吗?

一开始 球ax+by=1时 我居然直接使用了 extgcd ,然后解出x0,y0,则x=x0*1/gcd值,可是这道题目的 a,b的gcd不一定为1,所以1/gcd会等于0,所以 这道题目一定要先求出a,b,的gcd值,然后 a/=gcd,b/=gcd,d/=gcd,这样 再求出x,y,的值 就不需要再乘以 1/gcd啦,好开心 感觉越做自信越高了

接下里 的话 题目 对于 x,y是有要求 的  要x+y尽量小,ax+by尽量小,你求出的 x,y中有可能的是有负的,那很正常,因为题目要求的是测出d的重量,所以 有可能是

a*x+b*y=d;

a*x-b*y=d;

b*y-ax=d;

但是 题目要求是正的 这时候 就是考验对扩展欧几里德了解程度了 下面贴出关于这部分的性质:

对于不定整数方程pa+qb=c,若 c mod Gcd(a, b)=0,则该方程存在整数解,否则不存在整数解。
上面已经列出找一个
整数解的方法,在找到p * a+q * b = Gcd(a, b)的一组解p0,q0后,
/*p * a+q * b = Gcd(a, b)的其他整数解满足:
p = p0 + a/Gcd(a, b) * t
q = q0 - b/Gcd(a, b) * t(其中t为任意
整数)
至于pa+qb=c的整数解,只需将p * a+q * b = Gcd(a, b)的每个解乘上 c/Gcd(a, b) 即可
在找到p * a+q * b = Gcd(a, b)的一组解p0,q0后,应该是
得到p * a+q * b = c的一组解p1 = p0*(c/Gcd(a,b)),q1 = q0*(c/Gcd(a,b)),p * a+q * b = c的其他整数解满足:
p = p1 + b/Gcd(a, b) * t
q = q1 - a/Gcd(a, b) * t(其中t为任意
整数)
p 、q就是p * a+q * b = c的所有
整数解。
就是运用扩展欧几里德求出 的 p,q给的是最小的那一组 有可能是负的 而题目 明显要求了 x不能为负,所以要利用上述性质 来求出最小 正解

先求出最小正解的x1然后利用式子 y1=(d-a*x1)/b;

然后 求出 最小正解 y2,然后利用式子x2=(d-b*y2)/a;

然后 比较 x1+y1 x2+y2的大小  取小的那一组

#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set> #define ll long long
#define LL __int64
#define eps 1e-8 const ll INF=9999999999999; #define M 400000100 #define inf 0xfffffff using namespace std; //vector<pair<int,int> > G;
//typedef pair<int,int> P;
//vector<pair<int,int>> ::iterator iter;
//
//map<ll,int>mp;
//map<ll,int>::iterator p;
//
//vector<int>G[30012]; ll GCD(ll a,ll b)
{
while(b)
{
ll r=b;
b=a%b;
a=r;
}
return a;
} ll extgcd(ll a,ll &x,ll b,ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll r=extgcd(b,x,a%b,y);
ll t=x;
x=y;
y=t-a/b*y;
return r;
} int main(void)
{
ll a,b,d;
while(cin>>a>>b>>d)
{
if(a+b+d == 0)
break;
ll x0,y0;
ll gcd=GCD(a,b);//这里要先求出 a,b的gcd值
a/=gcd;
b/=gcd;
d/=gcd;//都除以gcd
extgcd(a,x0,b,y0);
ll x=x0*d;
ll y=y0*d;//求出的 x0就不需要 乘以1/gcd 了,
ll x1=x,y1=y;
x1=(x%b+b)%b;//这里是假设不知道x,y的正负情况,求出x1的最小正解
y1=(d-x1*a)/b;//对应x1的y1最小正解
if(y1<0)
y1=0-y1;
ll x2=x,y2=y;
y2=(y2%a+a)%a;//这里是假设不知道x,y的正负情况,求出y2的最小正解
x2=(d-y2*b)/a;//对应x2的y1最小正解
if(x2<0)
x2=0-x2;
if(x1+y1 > x2+y2)//比较 x1+y1 x2+y2的大小
x=x2,y=y2;
else
x=x1,y=y1;
cout<<x<<" "<<y<<endl;
}
}

poj2142 The Balance 扩展欧几里德的应用 稍微还是有点难度的的更多相关文章

  1. POJ2142 The Balance (扩展欧几里德)

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia The Balance 题目大意  你有一个天平(天平左右两边都可以放砝码)与重量为a,b(1<= ...

  2. POJ-2142 The Balance 扩展欧几里德(+绝对值和最小化)

    题目链接:https://cn.vjudge.net/problem/POJ-2142 题意 自己看题吧,懒得解释 思路 第一部分就是扩展欧几里德 接下来是根据 $ x=x_0+kb', y=y_0- ...

  3. poj2142-The Balance(扩展欧几里德算法)

    一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...

  4. POJ 2142 The Balance【扩展欧几里德】

    题意:有两种类型的砝码,每种的砝码质量a和b给你,现在要求称出质量为c的物品,要求a的数量x和b的数量y最小,以及x+y的值最小. 用扩展欧几里德求ax+by=c,求出ax+by=1的一组通解,求出当 ...

  5. POJ2115 C Looooops 扩展欧几里德

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2115 题意 对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次 ...

  6. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...

  7. [BZOJ1407][NOI2002]Savage(扩展欧几里德)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1407 分析: m,n范围都不大,所以可以考虑枚举 先枚举m,然后判定某个m行不行 某个 ...

  8. 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  9. 51nod 1352 扩展欧几里德

    给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数. 提示: 对于第二组测试数据,集合分别 ...

随机推荐

  1. python定制类(1):__getitem__和slice切片

    python定制类(1):__getitem__和slice切片 1.__getitem__的简单用法: 当一个类中定义了__getitem__方法,那么它的实例对象便拥有了通过下标来索引的能力. c ...

  2. php大图

    原文地址:https://laravel-china.org/articles/9450/php-fpm-vs-swoole

  3. 2017年浙江工业大学大学生程序设计迎新赛预赛 H - 栗酱的文明

    题目描述         “伟大的勇士兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您.您骑着威风凛凛的小白兔,带领兔栽栗们奋勇前行.伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来,冲在每场战争的前线 ...

  4. Mock(模拟后端接口数据)配合Vuex的使用

    1.下载Mock  cnpm install Mockjs -S 2.新建一个data.js存放新生成的mock文件 编辑mock  并导出 const Mock = require('mockjs' ...

  5. 最短路——spfa

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...

  6. TCP/IP——ARP与RARP简记

    ARP(Address Resolution Protocol):ARP为IP地址到对应的硬件地址(MAC)之间提供动态映射.这个过程是自动完成的,一般应用程序用户和系统管理员不必要关心. ARP高速 ...

  7. Inno Setup Winfrom 打包工具

    1.下载并安装Inno Setup 编译器 2.安装完成后打开Inno Setup 编译器: 3.选择[用「脚本向导」创建新的脚本文件(S)]: 4.点击[下一步]: 5.填写制作后程序的基本信息: ...

  8. android studio 安卓工作室 汉化完整版

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 汉化包 百度云盘 下载地址:https://pan.baidu.com/s/1pLjwy ...

  9. 加密url

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 可以采用 https 证书 双向 加密验证. 加密到 JNI 里面,还是可以通过抓包工具 ...

  10. luogu 11月月赛 斐波那契数列

    本来想作为水题刷,很快就想出了做法,结果细节实现太差改了好久... 根据题意你会发现其实就是求方程 ax+by=k解的个数. 此时 a=f[i],b=f[i+1],而(x,y)就是你要求的数对. 于是 ...