Gcd(a,b)=gcd(b,a%b)
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;}
那么来看拓展欧几里得算法
先上代码
Gcd(a,b)=ax+by 这是一个不定方程,扩欧用来求x,y的整数解
void exgcd(int a,int b,LL &x,LL &y){
if(b==0){x=1,y=0;return;}
exgcd(b,a%b,x,y);
LL t=x; x=y,y=t-a/b*y;
}
那么为什么会这样呢
让我们来证明一下:
我们想求一组(x,y)使得gcd(a,b)=ax+by
根据b≠0 -->gcd(a,b)=gcd(b,a%b)
如果我们现在有x’,y’,那么gcd(b,a%b)=b*x'+(a%b)*y'
那么我们现在可以令 ax+by=b*x'+(a%b)*y' ①式
注意到a%b=a-a/b*b
带入①式得:ax+by=b*x'+(a-a/b*b)*y' ②式
注意它的每一项仅仅是由a,b相关的
改造
右边也以a,b为元 ax+by=a*y'+b*(x'-a/b*y')
得出一组特解:x=y' y=x'-a/b*y'
它这个递归的基为b=0
当b=0时,ax+by=gcd(a,b) 可以得出x=1,y=0;
证毕。。
证明结束了
如果还想看看题目的话可以看看noip 2012 D2T1