原题实际上就是求方程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. CPU相关知识-寄存器与存储器的区别

    存储器一般在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是 50MB/S左右.内存和寄存器就是为了解决存储器读写速度慢而 ...

  2. 转: CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法

    from: http://www.linuxde.net/2014/05/15576.html CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法 2014/05/ ...

  3. Spring MVC之cookies跟session 数据绑定

    在我最早接触web开发的中学时代,学习的asp技术对于session的概念其实很清楚 Session("username")="张三"下次要用的时候,直接用se ...

  4. Window.open()方法参数详解

    Window.open()方法参数详解 1, 最基本的弹出窗口代码   window.open('page.html'); 2, 经过设置后的弹出窗口   window.open('page.html ...

  5. webpack+react+redux+es6

    一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...

  6. C语言 百炼成钢4

    //题目10:打印楼梯,同时在楼梯上方打印两个笑脸. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdli ...

  7. 【转】PHP date("Y-m-d H:i:s");获取当前时间 差8小时解决办法

    原因:                                                                                              网络资 ...

  8. 可以ping通的打印机,没有办法打印

    可以ping通打印机的电脑,但是访问不了打印机的共享设置.\\XXX.XXX.XXX.XXX  之后出现如下错误: 您可能没有权限使用网络资源.请与这台服务器的管理员联系以查明您是否有访问权限.目前没 ...

  9. Java 征途:行者的地图 (转)

    http://www.cnblogs.com/mindwind/p/5251430.html Java 征途:行者的地图   前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走 ...

  10. 构建高转化率的着陆页-PS+HTML+网络营销

    课程简介 本课程是全网独家专业的着陆页课程,课程完整的再现了整个着陆页实战案例的开发过程,包括:策划.设计和实现.上线后的推广.优化及提高转化率的技巧等,本套课程能帮助您迅速掌握着陆页的能力,迅速洞察 ...