欧几里得算法
可以用来求解两个数 x 和 y 的最大公约数和最小公倍数( x*y/gcd(x,y) )
int gcd(int a,int b){
if(!b)
return a;
return gcd(b,a%b);
}
扩展欧几里得算法
可以用来求解不定方程 ax + by = gcd(a,b) 的一组解(x0,y0) ,以及其他各组解(x0+kb’,y0-ka’)
[a’ = a/gcd(a,b) b’ = b/gcd(a,b)]
int exgcd(int a,int b,int &d,int &x,int &y){
if(!b){
d = a; x=1; y=0;
}
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
快速幂(取模)
int ksm(int a,int b,int mod){
int ans = 1;
int base = b%mod;
while(b){
if(b&1)
ans = (ans*base)%mod;
b>>1;
base=(base*base)%mod;
}
return ans;
}