0
点赞
收藏
分享

微信扫一扫

Line CodeForces - 7C

​​点击打开链接​​

欧几里得算法

扩展欧几里得就是 求方程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;
}

 

 

 

 


举报

相关推荐

0 条评论