您的位置:首页 > 其它

扩展欧几里得模板

2017-08-18 10:01 218 查看

扩展欧几里得模板

[align=center]
[/align]
int e_gcd(int a, int b, int& x, int& y){
if(b == 0){
x = 1;
y = 0;
return a;
}
int ans = e_gcd(b, a%b, y, x);
y -= x*(a/b);

return ans;
}

[align=center]
[/align]
[align=left]返回值为gcd(a,b),用于计算a*x+b*y==gcd(a,b)的通解[/align]
[align=left]    x=x0+b/gcd(a,b)*t;[/align]
[align=left]    y=y0-a/gcd(a,b)*t;[/align]
[align=left]最小解:[/align]
[align=left]    am=a/gcd(a,b),bm=b/gcd(a,b);[/align]
[align=left]    x=((x%bm)+bm)%bm; [/align]
[align=left]    y=((y%am)+am)%am;[/align]
[align=left]保证是正数,x,y只能计算一个最小解,另一个看对方值计算[/align]

求模的逆元



这里x是a相对于m的逆元
公式a*x+m*y==1;  //需要gcd(a,m)==1
求得x做最小解可得逆元

[align=left]
[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息