拓展欧几里得
首先我们要知道一个结论:
裴蜀定理(或贝祖定理)
存在整数x,y 使得ax+by=gcd(a,b) 成立
推导
建议拿着笔一起做推导,我们知道欧几里得算法,即辗转相除法,核心公式为gcd(a,b)=gcd(b,a%b),我们就推导出拓展欧几里得。
a * x1+b * y1=gcd(a,b)=gcd(b,a%b)=b * x2+(a%b) * y2
这样我们就得到了状态转移方程?
其中a%b可以写成a-((a/b)*b),我们就得到了最终的状态转移方程,同时因为采取了递归的写法,我们会由2状态推出1状态,
exgcd(b,a%b,x,y);
ll temp=x;
x=y;
y=temp-(a/b)*y;
模板
#include<iostream>
using namespace std;
typedef long long ll;
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
exgcd(b,a%b,x,y);
ll temp=x;
x=y;
y=temp-(a/b)*y;
return ;
}
int main()
{
ll x,y;
exgcd(5,3,x,y);
cout<<x<<' '<<y<<endl;
}