poj 2142 扩展欧几里得解ax+by=c
原题实际上就是求方程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的更多相关文章
- poj 1061 扩展欧几里得解同余方程(求最小非负整数解)
题目可以转化成求关于t的同余方程的最小非负数解: x+m*t≡y+n*t (mod L) 该方程又可以转化成: k*L+(n-m)*t=x-y 利用扩展欧几里得可以解决这个问题: eg:对于方程ax+ ...
- The Balance POJ 2142 扩展欧几里得
Description Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of ...
- Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)
一.Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...
- poj 2891 扩展欧几里得迭代解同余方程组
Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...
- 扩展欧几里得 求ax+by == n的非负整数解个数
求解形如ax+by == n (a,b已知)的方程的非负整数解个数时,需要用到扩展欧几里得定理,先求出最小的x的值,然后通过处理剩下的区间长度即可得到答案. 放出模板: ll gcd(ll a, ll ...
- poj 1061(扩展欧几里得定理求不定方程)
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特 ...
- 青蛙的约会 扩展欧几里得 方程ax+by=c的整数解 一个跑道长为周长为L米,两只青蛙初始位置为x,y;(x!=y,同时逆时针运动,每一次运动分别为m,n米;问第几次运动后相遇,即在同一位置。
/** 题目:青蛙的约会 链接:https://vjudge.net/contest/154246#problem/R 题意:一个跑道长为周长为L米,两只青蛙初始位置为x,y:(x!=y,同时逆时针运 ...
- poj 2115 扩展欧几里得
题目链接:http://poj.org/problem?id=2115 题意: 给出一段循环程序,循环体变量初始值为 a,结束不等于 b ,步长为 c,看要循环多少次,其中运算限制在 k位:死循环输出 ...
- poj 2142 拓展欧几里得
#include <cstdio> #include <algorithm> #include <cstring> #include <iostream> ...
随机推荐
- iOS9 判断微信qq是否安装
iOS 9检测QQ.微信是否安装无效的解决方法 在info.plist里面添加LSApplicationQueriesSchemes(Array类型),然后插入weixin, wechat, mqq的 ...
- JavaScript---闭包和作用域链
作用域和作用域链: 参考文章 :http://www.cnblogs.com/malinlin/p/6028842.html http://www.cnblogs.com/lhb25/archive ...
- Swift中的Masonry第三方库——SnapKit
在OC开发时我常用一个名叫Masonry的第三方Autolayout库,在转Swift后发现虽然Swift可以混编OC,但总感觉有些麻烦,在Github上发现了这个叫做SnapKit的第三方库 ...
- f2fs解析(八)node 管理器中的node_info
free_info 功成身退,node_info顺利接班. // 这里还是蛮复杂的一件事,如果不搞清除的话,这个历史性的接班工作我们就接不上 上面说到 alloc_nid 和 alloc_nid_do ...
- 24Mybatis_延迟加载——用association来实现
resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如果查询订单并且关 ...
- 802.1x协议&eap类型
EAP: 0,扩展认证协议 1,一个灵活的传输协议,用来承载任意的认证信息(不包括认证方式) 2,直接运行在数据链路层,如ppp或以太网 3,支持多种类型认证 注:EAP 客户端---服务器之间一个协 ...
- js实现倒计时 类似团购网站
一.demo与效果展示 为节约时间,我就直接套用了企鹅团的界面作为demo的背景.因为是倒计时,所以需要一个固定的时间,为了n年后,某位仁兄打开demo页面依然在倒计时,所以我把倒计时时间设成了205 ...
- 20135231 —— Linux 基础入门学习
20135231 何佳 学习计时:共12小时 读书:5 代码:2 作业:2 博客:3 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Li ...
- android的progressDialog 的使用。android数据异步加载 对话框提示
在调用的Activity中定义一个全局的 progressDialog 点击按钮的时候调用下面这句 progressDialog = ProgressDialog.show(SearchActivit ...
- 小白学习mysql之优化基础(EXPLAIN的连接类型)
## 导语很多情况下,有很多人用各种select语句查询到了他们想要的数据后,往往便以为工作圆满结束了.这些事情往往发生在一些学生亦或刚入职场但之前又没有很好数据库基础的小白身上,但所谓闻道有先后,只 ...