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> ...
随机推荐
- Linux压力测试工具Tsung安装、使用和图形报表生成
简介 Tsung 是一个压力测试工具,可以测试包括HTTP, WebDAV, PostgreSQL, MySQL, LDAP, and XMPP/Jabber等服务器.针对 HTTP 测试,Tsung ...
- 测试杂感:Bug Bash
缺陷大扫除(Bug Bash)是一项短期的全员测试活动.在微软,许多开发团队会在里程碑(milestone)的末期执行缺陷大扫除.程序员.测试员.程序经理.内部用户.市场人员在1~3天的时间窗口中,运 ...
- Android Studio系列教程四--Gradle基础
Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...
- AD域的安装
AD域的安装 初始化设置,改计算机名字dcserver,改静态ip,改dns指向自己. dcpromo,执行后自动装了dns. 装完后检查 1,本地用户没了 2,dns指向自己 3,dns记录是否 ...
- linux下的zip命令
1.把/home目录下面的mydata目录压缩为mydata.zipzip -r mydata.zip mydata #压缩mydata目录2.把/home目录下面的mydata.zip解压到myda ...
- SpringMVC视图解析器(转)
前言 在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视图解析器.当我们对SpringMVC控制的资源发起请求时,这些请求都会被Sprin ...
- 社交网站好友储存设计和实现(PHP+MySQL)
最近手头的一个网站新增社交功能,用户可以互加好友. 通常,对好友列表设计是新增一个好友,就往好友列表新增一行,当要查询一个用户好友 SELECT * FROM WHERE userid="1 ...
- 预备作业02:成功经验与C语调查20155230
成功的经验 在写这一次的博客之前,我看了一部分同学所写的博客.因为我不懂关于自己更优秀的技能这一栏要怎么写,所以想要去找能以借鉴的东西.看完发现,这些同学在介绍自己技能时更多的是写自己在某一领域的成就 ...
- nodeJs--模块module.exports与实例化方法;
在nodejs中,提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象.而在e ...
- org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback.....Parameter index out of range (1 > number of parameters, which is 0).;
sql有误,一般是 sql语句少了问号.