poj2142 The Balance

poj2142 The Balance

exgcd

应分为2种情况分类讨论

显然我们可以列出方程

ax-by=±d

当方程右侧为-d时,可得

by-ax=d

于是我们就得到了2个方程:

ax-by=d

by-ax=d -> bx-ay=d

分别跑一遍exgcd,取abs(a)+abs(b)更小的那个

注意第二种情况先输出y,因为y对应a

#include<cstdio>
#include<cmath>
int a,b,d,xx,yy,x2,y2,g,p; //y1不能用..
void exgcd(int a,int b,int &x,int &y){
    if(!b) x=1,y=0,g=a;
    else exgcd(b,a%b,y,x),y-=x*(a/b);
}
void work(int a,int b,int &x,int &y){
    exgcd(a,b,x,y);
    x*=d/g; p=b/g; //exgcd求的方程右侧为gcd(a,b),所以要 *d/gcd(a,b)
    x=(x%p+p)%p; 根据性质得最小解
    y=abs((a*x-d)/b);
}
int main(){
    while(scanf("%d%d%d",&a,&b,&d)&&a+b+d){
        work(a,b,xx,yy);
        work(b,a,x2,y2);
        if(xx+yy<x2+y2) printf("%d %d\n",xx,yy);
        else printf("%d %d\n",y2,x2); //倒着输出
    }return 0;
}

 

转载于:https://www.cnblogs.com/kafuuchino/p/9777855.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值