题目是很裸的扩展欧几里得,但是对x,y有限制条件,要求所有x,y中abs(x)+abs(y)最小,在这个条件下要求abs(a* x)+abs(b* y)最小

显然我们需要用扩展欧几里得求得一组解,问题在于如何处理这组解以得到符合条件的值。

我是这样处理的:最小的两组解分别为x为最小非负整数和y为最小非负整数的情况。然后就过了,可是我想证明的时候证明了好久都没有证明成功。在网上看其他人的题解找到一种靠谱的做法时我们令a>b(如果不是这样就交换x,y,a,b),然后最小的和z=|x+b/dk|+|y-a/dk|,当后一项为正时,z随k单调减小,当后一项为负时,z随k单调增大。因此最小值在y-a/d*k=0的附近,一般应该是有两个值,比较一下。

至于为什么我的想法正确我还得再想想。不过有个小经验就是在处理出x后不要再去求k什么的再去求y,可以直接将y带入方程得到y的值。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<ctime>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;void ex_gcd(ll a,ll b,ll& d,ll& x,ll& y)
{if(!b) {d=a; x=1; y=0;}else {ex_gcd(b,a%b,d,y,x); y-=(a/b)*x;}
}ll a,b,c;ll Abs(int x)
{return x<0?-x:x;
}int main()
{while(~scanf("%lld%lld%lld",&a,&b,&c)){ll x,y,d,k1,k2,a1,b1,k,x1,x2,y1,y2;if(!a && !b && !c) break;ex_gcd(a,b,d,x,y);  a1=a/d; b1=b/d;x=c/d*x; y=c/d*y;//printf("%lld %lld\n",x,y);x1=(x%b1+b1)%b1; y1=Abs((c-a*x1)/b);y2=(y%a1+a1)%a1; x2=Abs((c-b*y2)/a);//printf("%lld %lld\n",x1,y1);//printf("%lld %lld\n",x2,y2);if(x1+y1<y2+x2){printf("%lld %lld\n",x1,y1);}else if(x1+y1>y2+x2){printf("%lld %lld\n",x2,y2);}else{ll c1=a*x1+b*y1; ll c2=a*x2+b*y2;if(c1<c2){printf("%lld %lld\n",x1,y1);}else{printf("%lld %lld\n",x2,y2);}}}return 0;
}

POJ 2142——扩展欧几里得相关推荐

  1. POJ 1061扩展欧几里得

    扩展欧几里得的模板题,需要注意的是为了得到一个最小正数解我们要使ax+by=c中的a,b都是正数 #include<cstdio> #include<cstring> #inc ...

  2. POJ - 2142 The Balance(扩展欧几里得)

    题目链接:点击查看 题目大意:给出两种重量的砝码,我们需要利用天平称出指定重量的药物,我们需要求出这两种砝码各自的数量,使得砝码数量之和最小 题目分析:我们可以先列出关系式,假设两个砝码的重量分别为a ...

  3. 扩展欧几里得 POJ 1061

    感觉这道题目的数据好水啊...我的代码我都觉得姿势特别奇怪...竟然还过了... 好吧,原来不是姿势奇怪,而是逆元需要用的时候是余数也需要的时候,这里的余数是不需要的,所以就AC了 就说一下碰到的问题 ...

  4. POJ - 1061 青蛙的约会(扩展欧几里得)

    题目链接:点击查看 题目大意:两只青蛙在一个单向循环数轴上跳动,给出初始位置和每秒跳动的距离以及数轴长度,问是否可以相遇,若能相遇求出最小时间 题目分析:自从第一次接触扩展欧几里得以来已经有半年时间了 ...

  5. POJ 1061 青蛙的约会 (扩展欧几里得)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 97673   Accepted: 18409 Descripti ...

  6. POJ 2142: 扩展欧几里得算法

    POJ 2142: The Balance Description Data 思路 扩展欧几里得算法 线性组合 Code --扩展欧几里得算法 原题传送门 Description Ms. Iyo Ki ...

  7. poj-青蛙的约会(扩展欧几里得)nyoj-小柯的约会

    由题意可列出方程 x + m * s - (y + n * s) = k * l; 化简得   (n-m)*s + k*l = x - y 化简得   (n-m)*s = x - y (mod l); ...

  8. 欧几里得定理与扩展欧几里得定理

    欧几里的定理(辗转相除法): gcd(a,b) = gcd(b,a%b) gcd(a,b)表示a,b的最大公约数 证明: 设 a > b c = a%b a = k * b + c (k为某个整 ...

  9. 求解线性同余方程--扩展欧几里得

    资料来源:https://blog.csdn.net/ //求解ax=b(mod m) 返回0为无解,否则返回gcd(a,m)个mod m意义下的解,用X[]存 int mod(int a, int ...

最新文章

  1. filter执行先后问题_Thinkphp5框架变量覆盖导致远程代码执行
  2. ffmpeg本地编译没有ffplay解决方案
  3. 后续的C++测试并不一定会成功
  4. fedora yum 安装mysql
  5. azure不支持java1.9_java – 无法将Spring Boot应用程序部署到Azure
  6. 《微观经济学》第三章相互依存性与贸易的好处
  7. 阿里旺旺垃圾消息分析及解决方案探讨
  8. 并发(10):线程之间的协作(上)
  9. 复制-粘贴-剪切(深入Vim寄存器)Vim寄存器
  10. 计算机基础知识应用电子邮件,计算机基础知识及应用普及
  11. idea的几个好用快捷键、常用配置(包括git)、jdk和javaSE和javaEE、创建一个SE工程、debug、创建一个Web工程、打war包
  12. 为什么U盘中的文件夹和文件全部变成了快捷方式?
  13. Immanuel Kant and Russell
  14. Ubuntu 下最好用的pdf阅读器okular
  15. 网站流量提升-网站推广方法大全
  16. MySQL中order by 结果不准确的问题及解决
  17. ruby + nokogiri实现将天涯易读全帖转换成txt文件的功能
  18. add_metrology_object_line_measure 抓线(无对齐测量模型)
  19. 程序猿之华丽转身:必备技术面试手册
  20. 深入浅出React(四):虚拟DOM Diff算法解析

热门文章

  1. js判断对象数组中是否存在某个对象
  2. intellij idea中解决java.lang.VerifyError: Expecting a stackmap frame at branch target的方法
  3. LoadRunner
  4. rlwrap插件,实现sqlplus上下翻页
  5. 脑子越来越不好使,文字越来越像驮shi
  6. smarty引擎之练习
  7. 把checkbox复选框转换成单选按钮radio
  8. android 判断是否是标点符号_Java 中文字符判断 中文标点符号判断
  9. 微型计算机2017年9月上,2017年9月计算机一级考试WPS Office冲刺题
  10. 5页面title样式修改_认识html:实现网站页面是这么简单的一回事