1592. 裴蜀定理

题目已经告诉了拓展欧几里得算法的具体步骤,所以只需要将其翻译成代码即可。

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; }