您的位置:首页 > 其它

Line CodeForces - 7C

2017-11-27 21:17 309 查看
点击打开链接

欧几里得算法就是gcd

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

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

void calculate(ll a,ll b,ll c)
{
ll gcd,ans,x,y;
gcd=exgcd(a,b,x,y);
if(c%gcd!=0)
{
printf("-1\n");
return;
}
printf("%lld %lld\n",x*(c/gcd),y*(c/gcd));
return;
}

int main()
{
ll a,b,c,ans;
while(scanf("%lld%lld%lld",&a,&b,&c)!=EOF)
{
calculate(a,b,-c);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: