给出方程a*x+b*y=c,其中所有数均是整数,且a,b,c是已知数,求满足那个等式的x,y值?这个方程可能有解也可能没解也可能有无穷多个解(注意:这里说的解都是整数解)?

  既然如此,那我们就得找出有解和无解的条件!

  先给出定理:方程a*x+b*y=c有解,当且仅当 c%gcd(a,b)=0。

  定理的证明很容易,如下:

  证明:

  若c%gcd(a,b)=0,则一定存在一个整数K,有c=K*gcd(a,b), 而我们知道a*x+b*y=gcd(a,b)一定存在解(x1, y1)所以就有K*(a*x1 +b*y1 )  = K*gcd(a,b)------>a*K*x1 +b*K*y1 = c,得出解为:(K*x1 , K*y1 )。定理得证。

  那么在a*x+b*y=c有解的情况下如何求解呢?

  

  由上可知,a*x+b*y=c 与 a*x+b*y=K*gcd(a,b)是等价的。另外a*x+b*y=gcd(a,b)的一组解为 x1, y1。

  令a1=a/gcd(a,b), b1=b/gcd(a,b),c1=c/gcd(a,b).

  综上,我们可以得出x,y的一组解就是x1*c1, y1*c1(实际上这个解我们在上面的证明定理的过程中就可以得出这组解,只是我们要的是最小解,所以在此处给出),但是满足方程的解有无穷多个,在实际的解题中我们常常只要求其最小解。现以求x的最小解为例,至此我们已经求的一组解使得满足方程a*x+b*y=m,那么a*(x+n*b)+b*(y-n*a)=m显然也成立。可知x+n*b(n=....-2,-1,0,1,2....)就是方程x解集。存在一个k使得x+k*b>0,x的最小解就是(x+k*b)%b.若我们将方程两边同时除以gcd(a,b),则方程变为a1*x+b1*y=c1,同上分析可知。x的最小值就是(x+k*b1)%b1,由于b1<=b,故这个值定会小于等于之前我们认为最小值。在实际求解时常用while(x<0) x+=b来使得为正的条件满足。

  另外给出所有解得公式,若x0,y0是该方程的一组整数解,那么该方程的所有整数解可表示为

  X = x0+b/(a,b)*t;

  Y = y0-a/(a,b)*t;

代码如下:

  

 #include <cstdio>
#include <cstring>
#include <cmath>
using namespace std; int Exgcd(int a, int b, int &x, int &y)
{
if(b==)
{
x=, y=;
return a;
}
int r = Exgcd(b, a%b, x, y);
int tp=x;
x = y;
y = tp-a/b*y;
return r;
} void Liner_qu(int a, int b, int c, int d, int &x, int &y)
{
a /= d, b/= d, c /= d;
x *= c; // 任意一解
y *= c;
int tx = x;
x %= b; //最小解,
if(x<=) x += (int)abs(b*1.0); //最小整数解
int k=(tx-x)/b;
y += k*a; //对应y的最小整数解
printf("%d %d\n", x, y);
} int main()
{
int a, b, c, d, x, y;
while(~scanf("%d%d%d", &a, &b, &c))
{
d = Exgcd(a, b, x, y);
if(a==&&b==&&c==) puts("1 -1");
else if((a==&&b==&&c) || c%d || (a&&b==&&c==))
puts("No solution");
else if(a&&b==)
printf("%d %d\n",c/a, -c/a);
else if(a==&&b)
printf("1 %d\n",c/b);
else
Liner_qu(a, b, c, d, x, y);
}
return ;
}

参考资料:百度百科

     http://www.cnblogs.com/void/archive/2011/04/18/2020357.html

解不定方程ax+by=m的最小解的更多相关文章

  1. POJ 2142 The Balance (解不定方程,找最小值)

    这题实际解不定方程:ax+by=c只不过题目要求我们解出的x和y 满足|x|+|y|最小,当|x|+|y|相同时,满足|ax|+|by|最小.首先用扩展欧几里德,很容易得出x和y的解.一开始不妨令a& ...

  2. 用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)

    数值分析里面经常会涉及到用MATLAB程序实现用列主元消去法分别解方程组Ax=b 具体的方法和代码以如下方程(3x3矩阵)为例进行说明: 用列主元消去法分别解方程组Ax=b,用MATLAB程序实现: ...

  3. 【线性代数】2-1:解方程组(Ax=b)

    title: [线性代数]2-1:解方程组(Ax=b) toc: true categories: Mathematic Linear Algebra date: 2017-08-31 15:08:3 ...

  4. HDU 2669 Romantic 扩展欧几里德---->解不定方程

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. 解同余式ax ≡ c(mod m)

    将式子变形为 ax-c=my 可以看出原式有解当且仅当线性方程ax-my=c有解 设g = gcd(a, m) 则所有形如ax-my的数都是g的倍数 因此如果g不整除c则原方程无解. 下面假设g整除c ...

  6. exgcd 解同余方程ax=b(%n)

    ax=n(%b)  ->   ax+by=n 方程有解当且仅当 gcd(a,b) | n ( n是gcd(a,b)的倍数 ) exgcd解得 a*x0+b*y0=gcd(a,b) 记k=n/gc ...

  7. POJ 1061 青蛙的约会 扩展欧几里德--解不定方程

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 81606   Accepted: 14116 Descripti ...

  8. caioj 1153 扩展欧几里德算法(解不定方程)

    模板题 注意exgcd函数要稍微记一下 #include<cstdio> #include<cctype> #include<algorithm> #define ...

  9. 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

随机推荐

  1. poj2385 简单DP

    J - 简单dp Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit ...

  2. (搬运工)国内顺利使用Google的另类技巧

    在特殊的地方和特殊的时间,流畅顺利使用Google的方法也会变得很特殊.分享一些奇葩的Google使用方法,通过下列网址也可以使用Google来搜索:http://www.GoogleStable.c ...

  3. crontab经验

    1.基本格式  第1列分钟1-59  第2列小时1-23(0表示子夜)  第3列日1-31  第4列月1-12  第5列星期0-6(0表示星期天)  第6列要运行的命令 2.关于日志 (1)基本日志位 ...

  4. Android中读取assets文件夹中的子文件夹内容

    文件结构如下:assets/info/info AssetManager am = this.getResources().getAssets(); InputStream input = null; ...

  5. win7 x64 jdk1.7.0_51

    1:我的 jdk与jre默认安装在:D:\Program Files\Java 2:配置环境变量(系统变量): (1)新建JAVA_HOME (2)新建CLASSPATH (3)编辑Path,%JAV ...

  6. poj2960 S-Nim

    大意:有n堆石子,每堆石子个数已知,两人轮流从中取石子, 每次可取的石子数x满足x属于集合S(k) = {s1,s2,s3...sk-1},问先拿者是否有必胜策略? 裸nim,可以用记忆化搜索. #i ...

  7. C51变量的存储

    一.全局变量和局部变量 全局变量和局部变量的区别在于作用域的不同.此外还有静态全局变量和静态局部变量. 全局变量作用域为全局,在一个源文件中定义,其他的源文件也可以应用.在其他的源文件中使用exter ...

  8. 设置EntityFramework 在开发时自动更新数据库

    1. NuGet 下载EntityFramework. 2. 定义Context 和 打开NuGet 命令 执行 Enable-Migrations , Libaray.DAL.Migrations. ...

  9. QWidget: Must construct a QApplication before a QPaintDevice的问题

    卧槽,无意中编译自己基于Qt创建的Debug工程的时候运行时发生了标题中的错误,原来是把Qt Release的库也放到additional dependencies里面了,同时链接了Debug和Rel ...

  10. /proc/uptime

    在Linux中,我们常常会使用到uptime命令去看看系统的运行时间,它与一个文件有关,就是/proc/uptime.这个文件里的两个参数所代表的意义如下. [root@app ~]#cat /pro ...