Line CodeForces - 7C

本文详细介绍了扩展欧几里得算法,该算法用于求解线性方程ax + by = c的最小整数解。文章首先给出了算法的基本原理,并通过递归的方式实现了扩展欧几里得算法。此外,还提供了具体的代码实现,帮助读者更好地理解和应用该算法。

点击打开链接

欧几里得算法参考https://www.cnblogs.com/hadilo/p/5914302.html

扩展欧几里得就是 求方程ax+by=c的最小整数解

1. c%gcd(a,b)!=0 则方程无解

2. c%gcd(a,b)==0

    则有a*x+b*y==gcd(a,b)成立

    因为gcd(a,b)==gcd(b,a%b) 所以b*x+(a%b)*y==gcd(b,a%b)

    因为a%b==a-(a/b)*b 所以a*y+b[x-(a/b)*y]=gcd(a,b)

    得到递推关系 xn-1=yn yn-1=xn-(a/b)*yn

    而边界就是在求gcd过程中当b==0时 有a'*x'+0*y'==gcd(a',0) 可以看出x'==1,y'==0

    再将求得的x与y同除 c/gcd(a,b) 即可

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

void exgcd(ll a,ll b,ll& x,ll& y)
{
    ll tx,ty;
    if(b==0){
        x=1,y=0;
        return;
    }
    exgcd(b,a%b,tx,ty);
    x=ty,y=tx-(a/b)*ty;
}

int main()
{
    ll a,b,c,gcd,x,y;
    scanf("%lld%lld%lld",&a,&b,&c);
    exgcd(a,b,x,y);
    gcd=a*x+b*y;
    if(c%gcd!=0) printf("-1\n");
    else printf("%lld %lld\n",-x*(c/gcd),-y*(c/gcd));

    return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值