题目已经告诉了拓展欧几里得算法的具体步骤,所以只需要将其翻译成代码即可。
当 a'=\gcd(a,b) 时,根据欧几里得算法的代码,应该返回 a' ,那么此时便可以设 x=1,y=0 ;由于每一次新的 x,y 都是根据上一步辗转相除得到的,所以可以在递归函数的递归部分的下方紧接着实现这个操作: x=y',y'=x'-\lfloor\dfrac ab\rfloor y' 可以把 x,y 设全局变量,也可以设指针参数,也可以设 C++ 传引用,即一种作用类似于指针的语法。
拓展欧几里得算法可以同时计算得到 \gcd(a,b),x,y ,但是本题不需要使用 \gcd(a,b) ,所以不返回这个值也可以。
同样地,这题卡 long long
。
下面给出两种细节略有差别的实现(均使用传引用)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, b, x, y;
void exgcd(ll a, ll b, ll &x, ll &y)
{
if (!b)
{
x = 1, y = 0;
return;
}
exgcd(b, a % b, x, y);
ll t = x;
x = y;
y = t - (a / b) * y;
}
signed main()
{
scanf("%lld%lld", &a, &b);
exgcd(a, b, x, y);
printf("%lld %lld", x, y);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, b, x, y;
void exgcd(ll a, ll b, ll &x, ll &y)
{
if (b == 0)
{
x = 1, y = 0;
return;
}
exgcd(b, a % b, y, x);
y -= a / b * x;
}
signed main()
{
scanf("%lld%lld", &a, &b);
exgcd(a, b, x, y);
printf("%lld %lld", x, y);
return 0;
}