- /******************
- 二元一次不定方程求解
- 给定a,b,c求ax+by=c的整数解。
- 解:
- 用到的定理
- 1、gcd(a,b)=gcd(b,a mod b)
- 2、若d|a且d|b,则d|ax+by(gcd(a,b)|ax+by)
- ******************/
- #include <stdio.h>
- // 求得ax+by=gcd(a,b) 的x,y值
- int Gcd(int a, int b, int* x, int* y)
- {
- int gcd;
- int temp;
- // b=0,ax=gcd(a,0)=a
- if (b==0)
- {
- *x= 1;
- *y = 0;
- return a;
- }
- gcd = Gcd(b,a%b,x,y);
- /*****************************
- gcd(b,amodb) = gcd(b,a-[a/b]*b)
- b*x'+(amodb)*y'=gcd(a,b)
- =b*x'+(a-[a/b*b])*y'
- =a*y'+b*(x'-[a/b]*y')
- 令x=y',y=x'-[a/b]y';
- ******************************/
- temp = *x;
- *x = *y;
- *y = temp - a/b*(*y);
- return gcd;
- }
- // 判断是否有解并且求 ax+by=c特解
- // 对于ax+by=gcd(a,b),ax+by=c.
- // 如果gcd(a,b)|c,ax+by=c有很多解。
- // 否则就无解
- bool Judgment(int a,int b,int c, int* x, int *y)
- {
- int gcd=Gcd(a,b,x,y);
- if (0 != c%gcd)
- {
- return false;
- }
- // 这个是特解
- *x=(*x)*c/gcd;
- *y=(*y)*c/gcd;
- // 所有解为无数个
- /*******
- 1.x=x0-bt
- 2.y=y0+at
- 1式乘以a加上2式乘以b有
- ax+by=ax0+by0=c
- ******/
- }
- int main(void)
- {
- int a;
- int b;
- int c;
- int x;
- int y;
- scanf("%d%d%d", &a,&b,&c);
- if (Judgment(a,b,c,&x,&y))
- {
- printf("%d %d", x,y) ;
- }
- return 0;
- }