刚学习的扩展欧几里得算法,刷个水题

求解  线性不定方程 和  模线性方程

求方程 ax+by=c 或 ax≡c (mod b) 的整数解

1、ax+by=gcd(a,b)的一个整数解:

<span style="font-size:14px;">void ex_gcd(int a,int b,int &d,int &x,int &y)//扩展欧几里得算法
{
if(!b){d=a;x=1;y=0;}
else {ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}
}</span>

2、ax+by=c的全部整数解:

方程两边同一时候乘以g/c(g为a,b的最大公约数)。则原方程为  g *a/c *x+g*b/c*y=g

则g*x/c=x0,g*y/c=y0         (  x0,y0为 方程ax+by=gcd(a,b)的一个特解)

所以原方程的一个特解x=x0*c/g,y=y0*c/g

求通解的过程省略。

。。

最后通解为 (x+kb1,y-ka1)   b1=b/g,a1=a/g。

3、ax≡c (mod b)方程的全部整数解:

ax和c关于模b同余。则(ax-c)是b的整数倍。设倍数为y,则原方程等价于 ax-c=by,移项得 ax-by=c,转变为求解ax+by=c的形式

假设两个数的最大公约数为1。则两个数互质

题目分析:

给定 a b k找到满足ax+by=k 的令|x|+|y|最小(等时令a|x|+b|y|最小)最好还是a 〉b

先用扩展欧几里得算法求出 一组解 x0。y0,通解能够表示为x=x0+b/d *t y=y0-a/d *t

|x|+|y|=|x0+b/d *t |+|y0-a/d *t| 这个关于t的函数的最小值在  t  =  y0*d/a  附近的两整点里取。故直接验证这两点就可以。

由于   设a>b之后

|x0+b/d *t| 单调递增,|y0-a/d*t| 先递减再递增。

因斜率a/d>b/d。所以总的|x0+b/d *t |+|y0-a/d *t| 先递减再递增,使y0-a/d*t0=0 的t0附近有最小值。

//转载

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int x0,z1,a1,b1;
void ex_gcd(int a,int b,int &d,int &x,int &y)
{
if(!b){d=a;x=1;y=0;}
else {ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int calx(int k)
{
return abs(x0+k*b1);
}
int caly(int k)
{
return abs(z1-k*a1);
}
int main()
{
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c)&&(a||b||c)){
int flag=1;
if(a<b) {flag=0;swap(a,b);}
int d,x,y,k,k1,k2;
ex_gcd(a,b,d,x,y);
x0=x*(c/d),z1=y*(c/d);
a1=a/d,b1=b/d,k1=z1/a1;
if(k1*a1-z1>=0) k1--;
k2=k1+1;
if(calx(k1)+caly(k1)>calx(k2)+caly(k2)) k=k2;
else if(calx(k1)+caly(k1)<calx(k2)+caly(k2)) k=k1;
else{
if(calx(k1)*a+caly(k1)*b>calx(k2)*a+caly(k2)*b) k=k2;
else k=k1;
}
int ansx=calx(k);
int ansy=caly(k);
if(!flag){
printf("%d %d\n",ansy,ansx);
}
else printf("%d %d\n",ansx,ansy);
} return 0;
}

POJ2142——The Balance的更多相关文章

  1. poj2142 The Balance

    poj2142 The Balance exgcd 应分为2种情况分类讨论 显然我们可以列出方程 ax-by=±d 当方程右侧为-d时,可得 by-ax=d 于是我们就得到了2个方程: ax-by=d ...

  2. [暑假集训--数论]poj2142 The Balance

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

  3. POJ2142 The Balance (扩展欧几里德)

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia The Balance 题目大意  你有一个天平(天平左右两边都可以放砝码)与重量为a,b(1<= ...

  4. POJ-2142 The Balance 扩展欧几里德(+绝对值和最小化)

    题目链接:https://cn.vjudge.net/problem/POJ-2142 题意 自己看题吧,懒得解释 思路 第一部分就是扩展欧几里德 接下来是根据 $ x=x_0+kb', y=y_0- ...

  5. poj2142 The Balance 扩展欧几里德的应用 稍微还是有点难度的

    题目意思一开始没理解,原来是 给你重为a,b,的砝码 求测出 重量为d的砝码,a,b砝码可以无限量使用 开始时我列出来三个方程 : a*x+b*y=d; a*x-b*y=d; b*y-ax=d; 傻眼 ...

  6. POJ2142:The Balance (欧几里得+不等式)

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

  7. The Balance(poj2142)

    The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5452   Accepted: 2380 Descr ...

  8. POJ2142:The Balance——题解

    http://poj.org/problem?id=2142 题目大意:有一天平和两种数量无限的砝码(重为a和b),天平左右都可以放砝码,称质量为c的物品,要求:放置的砝码数量尽量少:当砝码数量相同时 ...

  9. Sample a balance dataset from imbalance dataset and save it(从不平衡数据中抽取平衡数据,并保存)

    有时我们在实际分类数据挖掘中经常会遇到,类别样本很不均衡,直接使用这种不均衡数据会影响一些模型的分类效果,如logistic regression,SVM等,一种解决办法就是对数据进行均衡采样,这里就 ...

随机推荐

  1. 【DFS】NYOJ-325-zb的生日

    [题目链接:NYOJ-325] 一道以我名字命名的题目,难道要我生日的时候再A? 思路:依旧深搜,但这个问题应该有一个专有名词吧,看别的博客说是 “容量为 sum/2 的背包问题”,不懂... // ...

  2. Android 如何直播RTMP流

    在android上,视频/音频流直播是极少有人关注的一部分.每当我们讨论流媒体,RTMP(Real Time Messaging Protocol)是不可或缺的.RTMP是一个基本的视频/音频直播流协 ...

  3. css3属性及事例

    在看网上别的前端大牛的作品时,总会有新的收获,我想很多人应该都知道box-shadow,但是不知道有没有接触过这个 box-shadow: 2px 2px 4px rgba(0,0,0,0.4)  , ...

  4. Linux下通过ioctl系统调用来获取和设置网络信息

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

  5. mvc项目,导出到Excel,中文显示乱码

      1 public class HomeController : Controller 2 { 3 static List<User> GetUsers() 4 { 5 List< ...

  6. [Everyday Mathematics]20150206

    $$\bex \sen{fg}_{L^1}\leq C\sen{f}_{L^{r,\al}}\sen{g}_{L^{r',\al'}}, \eex$$ 其中 $$\bex f\in L^{r,\al} ...

  7. Mysql 多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JO ...

  8. Linux基本命令(1)管理文件和目录的命令

    Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touc ...

  9. 用duilib制作仿QQ2013动态背景登录器

    转载请说明原出处,谢谢~~ 在上一篇博客里,我修复了CActiveXUI控件的bug,从而可以使用flash动画来制作程序的背景,这篇博客说明一下应该怎么使用CActiveXUI控件创建透明无窗体的背 ...

  10. WordPress的SEO技术

    原文:http://blog.wpjam.com/article/wordpress-seo/ 文章目录[隐藏] 内容为王 页面优化 标题 链接(URL) Meta 标签 语义化 H1 H2 H3 等 ...