欧几里得算法
已知a和b,求出(gcd(a,b))
时间复杂度(O(log n))
(gcd(a,b)*lcm(a,b)=a*b)
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
模板题:hdu2104 hide handkerchief
扩展欧几里得算法
求出所有的x,y,使得对于给定的a,b,满足(ax+by=c)
时间复杂度(O(log n))
当且仅当(gcd(a,b)|c)时,存在整数解x,y
所以exgcd可以求解方程(ax+by=gcd(a,b))
(bx1+(a\%b)y1=gcd(b,a\%b))
(bx1+(a-blfloorfrac{a}{b}
floor)y1=gcd(a,b))
(ay1+b(x1-lfloorfrac{a}{b}
floor y1)=gcd(a,b))
所以原方程中,(left{egin{aligned}x=y1\y=x1-lfloorfrac{a}{b}
floor y1end{aligned}
ight.)。通过递归求出x1,y1,可以得到x,y
原方程的解集:({(x,y)|x=x1+k*b/gcd(a,b),y=y1-k*a/gcd(a,b),kin z})
void exgcd(int a,int b,int& x,int& y,int& d){
if(!b) {y=0;x=1;d=a;return;}
exgcd(b,a%b,y,x,d);
y-=a/b*x;
}
模板题:hdu2669 Romantic