扩展欧几里得算法 AcWing 877. 扩展欧几里得算法
原题链接
算法标签
数学问题 扩展欧几里得算法 裴蜀定理
思路
裴蜀定理
若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
证明
代码
#include<bits/stdc++.h>
#define int long long
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>b;--i)
using namespace std;
int x, y;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar(x%10^48);
}
// ax+by=gcd(a, b)求x, y
int exgcd(int a, int b, int &x, int &y){
if(!b){
x=1, y=0;
return a;
}
// 转化为bx'+(a%b)y'=gcd(b, a%b)求x' y'
int d=exgcd(b, a%b, y, x);
y-=a/b*x;
return d;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n=read();
while(n--){
int a=read(), b=read();
exgcd(a, b, x, y);
printf("%lld %lld\n", x, y);
}
return 0;
}
模板
int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈