原题实际上就是求方程a*x+b*y=d的一个特解,要求这个特解满足|x|+|y|最小

套模式+一点YY就行了

总结一下这类问题的解法:

对于方程ax+by=c

设tm=gcd(a,b)

先用扩展欧几里得求出方程ax+by=tm的解x0、y0

然后有a*x0+b*y0=tm

令x1=x0*(c/tm),y1=y0*(c/tm)

则a*x1+b*y1=c

x1、y1即原方程的一个特解

这个方程的通解:xi=x1+k*(b/m),yi=y1-k*(a/m)

另:如果要求yi的最小非负解?令r=a/tm,则解y2=(y1%r+r)%r

针对本题,求出x1、y1后可以YY一下:

(1):若x1>0,y1>0,

   1.y1-=(a/m),直到y1<0

   2.y1+=(a/m),直到x1<0

(2):若x1<0,y1>0

     y1-=(a/m),直到y1<0

易知最优解一定出现在这一咕噜里头,操作的同时更新最优答案即可。

 #include <iostream>
#include <cmath>
using namespace std; int gcd(int a,int b){
if (b==) return a;
return gcd(b,a%b);
} int extgcd(int a,int b,int& x,int& y){
int d=a;
if (b!=){
d=extgcd(b,a%b,y,x);
y-=(a/b)*x;
}else{
x=;y=;
}
return d;
} int main()
{
int a,b,d,ax,ay,ans;
while (cin>>a>>b>>d)
{
if (a== && b== && d==) break;
else
{
int x,y;
int tm=extgcd(a,b,x,y);
int x1=x*(d/tm),y1=y*(d/tm);
int ra=a/tm,rb=b/tm;
y1=(y1%ra+ra)%ra;
x1=(d-y1*b)/a;
int x2=x1,y2=y1;
ans=abs(x2)+abs(y2);
ax=x2; ay=y2;
if (x2<)
{
while (y2>)
{
y2-=ra; x2+=rb;
if ((abs(y2)+abs(x2))<ans)
{
ans=abs(y2)+abs(x2);
ax=x2; ay=y2;
}
}
}
else if (x2>)
{
while (y2>)
{
y2-=ra; x2+=rb;
if ((abs(y2)+abs(x2))<ans)
{
ans=abs(y2)+abs(x2);
ax=x2; ay=y2;
}
}
x2=x1; y2=y1;
while (x2>)
{
y2+=ra; x2-=rb;
if ((abs(y2)+abs(x2))<ans)
{
ans=abs(y2)+abs(x2);
ax=x2; ay=y2;
}
}
}
cout<<abs(ax)<<" "<<abs(ay)<<endl;
}
}
return ;
}

poj 2142 扩展欧几里得解ax+by=c的更多相关文章

  1. poj 1061 扩展欧几里得解同余方程(求最小非负整数解)

    题目可以转化成求关于t的同余方程的最小非负数解: x+m*t≡y+n*t (mod L) 该方程又可以转化成: k*L+(n-m)*t=x-y 利用扩展欧几里得可以解决这个问题: eg:对于方程ax+ ...

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

    Description Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of ...

  3. Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)

    一.Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...

  4. poj 2891 扩展欧几里得迭代解同余方程组

    Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...

  5. 扩展欧几里得 求ax+by == n的非负整数解个数

    求解形如ax+by == n (a,b已知)的方程的非负整数解个数时,需要用到扩展欧几里得定理,先求出最小的x的值,然后通过处理剩下的区间长度即可得到答案. 放出模板: ll gcd(ll a, ll ...

  6. poj 1061(扩展欧几里得定理求不定方程)

    两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特 ...

  7. 青蛙的约会 扩展欧几里得 方程ax+by=c的整数解 一个跑道长为周长为L米,两只青蛙初始位置为x,y;(x!=y,同时逆时针运动,每一次运动分别为m,n米;问第几次运动后相遇,即在同一位置。

    /** 题目:青蛙的约会 链接:https://vjudge.net/contest/154246#problem/R 题意:一个跑道长为周长为L米,两只青蛙初始位置为x,y:(x!=y,同时逆时针运 ...

  8. poj 2115 扩展欧几里得

    题目链接:http://poj.org/problem?id=2115 题意: 给出一段循环程序,循环体变量初始值为 a,结束不等于 b ,步长为 c,看要循环多少次,其中运算限制在 k位:死循环输出 ...

  9. poj 2142 拓展欧几里得

    #include <cstdio> #include <algorithm> #include <cstring> #include <iostream> ...

随机推荐

  1. Unity 物理引擎动力学关节

    Unity物理引擎中的各个动力学关节 Hinge Joint (铰链关节) Fixed Joint (固定关节) Spring Joint (弹簧关节) Character Joint(角色关节) C ...

  2. man命令中的文本操作

    转自:http://www.cnblogs.com/chengmo/archive/2010/10/26/1861809.html 下面说下less命令操作: 光标移动操作: e  ^E  j  ^N ...

  3. Block 的基本用法

    iOS中Block的基础用法 转载自简书 本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对 ...

  4. docker中清理冗余的image,container

    1) 首先进入超级用户模式 [root@docker ~]# sudo su2) 删除container ( container运行时是不能删除的 )首先停止container [root@docke ...

  5. Power Builder的学习

    新的任务可能要运用PowerBuilder了,对这个名词之前仅是有所耳闻,工作中倒是用过power designer这个优秀的建模工具,出自同一家公司的产品,应该拥有同样的基因,于是上网开始查阅相关资 ...

  6. 【Mysql】日期时间格式化

    1.日期转成指定格式:DATE_FORMAT(date, format) 2.int型时间转成指定格式:FROM_UNIXTIME(unix_timestamp,format) 根据format字符串 ...

  7. mysql-5.7.14-winx64免安装版在win10下的详细配置过程

    1.配置文件 如果使用mysql的默认配置,在使用的过程中会出现很多问题,如汉字是乱码等. 在mysql的根目录(如:D:\mysql\mysql-5.7.14-winx64\)下,新建配置文件my. ...

  8. [CareerCup] 4.2 Route between Two Nodes in Directed Graph 有向图中两点的路径

    4.2 Given a directed graph, design an algorithm to find out whether there is a route between two nod ...

  9. 20145215《Java程序设计》第5周学习总结

    20145215<Java程序设计>第五周学习总结 教材学习内容总结 异常处理 语法与继承架构 异常就是程序在运行时出现不正常情况,异常的由来是因为Java把出现的问题封装成了对象,换句话 ...

  10. js对象的两种写法

    <script>     //定义一个对象,提供对应的方法或者属性     var s = {         sd1: function () { },         sd2: fun ...