POJ-2142 The Balance(扩展欧几里德算法)

#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int ex_gcd(int a,int b,int &x,int &y)
{
    int d;
    if(b==0)
    {x=1; y=0;  return a;}
    d=ex_gcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
int main()
{
          int a,b,c,x,y,d;
          while(!0)
         {
           scanf("%d%d%d",&a,&b,&c);
           if(a==0&&b==0&&c==0)
           break;
           d=ex_gcd(a,b,x,y);
           if(c%d!=0)
           printf("no solution\n");
           else
           {
            int x1=((c/d*x)%(b/d)+(b/d))%(b/d);  //找x的最小整数解
            int y1=(c-a*x1)/b;
            int y2=((c/d*y)%(a/d)+(a/d))%(a/d);  //找y的最小整数解
            int x2=(c-b*y2)/a;
            x1=abs(x1); y1=abs(y1); x2=abs(x2); y2=abs(y2);
            if(x1+y1<x2+y2)
            printf("%d %d\n",x1,y1);
            else if(x1+y1==x2+y2)
            {
                if(x1*a+y1*b<x2*a+y2*b)
                printf("%d %d\n",x1,y1);
                else
                printf("%d %d\n",x2,y2);
            }
            else
            printf("%d %d\n",x2,y2);
         }
        }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xigongdali/article/details/80042405