poj 1061 如何求求a * x + b * y = n的整数解 (x y )

poj 1061 如何求求a * x + b * y = n的整数解 (x y )
 
1 、先计算 Gcd(a,b) ,若 n 不能被 Gcd(a,b) 整除,则方程无整数 解;否则,在方程两边同时除以 Gcd(a,b) ,得到新的不定方程 a' * x + b' * y = n' ,此时 Gcd(a',b')=1;
2 、利用上面所说的欧几里德算法求出方程 a' * x + b' * y = 1 的一组整数解 x0,y0 ,则 n' * x0,n' * y0 是方程 a' * x + b' * y = n' 的一组整数解;
3 、根据数论中的相关定理,可得方程 a' * x + b' * y = n' 所有整数解为:
x = n' * x0 + b' * t
y = n' * y0 - a' * t   (t 为整数 )
上面的解也就是 a * x + b * y = n 的全部整数解。  
 
此时方程的所有解为: x=c*k1-b*t
x 的最小的可能值是 0
§ x=0 ,可求出当 x 最小时的 t 的取值,但由于 x=0 是可能的最 小取值,实际上可能 x 根本取不到 0 ,那么由计算机的取整除 法可知:由 t=c*k1/b 算出的 t ,代回 x=c*k1-b*t 中。 § 求出的 x 可能会小于 0 ,此时令 t=t+1 ,求出的 x 必大于 0 ;如 果代回后 x 仍是大于等于 0 的,那么不需要再做修正。
//满足关系:(x + m * s) - (y + n *s) = k*l  (k= 0 1 2  )即:(n - m)*s + l*k = x-y; 
//利用拓展的欧几里得解出可能的s 
#include <stdio.h>
#include <stdlib.h>

//求最大公约数 
__int64 gcd (__int64 a, __int64 b) 
{
    if (b == 0)
       return a;
       else
       gcd (b, a % b);
}

//求得满足 a*x + b*y = d;的x  y 
__int64 ex_Gcd (__int64 a, __int64 b, __int64 &x1, __int64 &y1)
{
    if ( b == 0 )
    {
         x1 = 1;
         y1= 0;
         return a;
    }
    
    int r = ex_Gcd( b, a%b, x1, y1);
    
    int temp = x1;
    x1 = y1;
    y1 = temp - a/b * y1;
}

int main ()
{
    __int64  x, y, m, n, l;
    int a, b, product, d;//a b 的最大公约数 product 
    int s, k;
    __int64 s1, k1, s2, k2;
    
    while ( scanf ("%I64d%I64d%I64d%I64d%I64d", &x, &y, &m, &n, &l ) != EOF )
    {
          a = n - m;
          b = l;
          d = x-y;
          product = gcd (a,b);
          
          if ( d % product != 0 )
             printf ("Impossible\n");
             else
             {
                 a = a / product;
                 b = b / product;
                 d = d / product;
                 ex_Gcd (a, b, s1, k1);               //得到(n-m)/product * s + l/product * k = 1;的 s k的解
                 s2 = d * s1;                     //得到(n-m)/product * s + l/product * k = d;的 s k的解
                 k2 = d * k1; 
                 
                 int t;
                  //s = s2 - b * t;    用下面的方法处理满足条件的解 
                 //k = k2 - a * t;
                 
                 t = s2 / b;
                 s = s2 - b * t;
                 if ( s <= 0)
                 {
                      s += b;
                 } 
                 printf ("%d\n", s);
             }
    }
    //system ("pause");
    return 0 ;
}

你可能感兴趣的:(poj 1061 如何求求a * x + b * y = n的整数解 (x y ))