51nod 1256 乘法逆元 (扩展欧几里得求逆元)

来源:互联网 发布:付磊 武汉大学 知乎 编辑:程序博客网 时间:2024/06/08 09:11

给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。
Input

输入2个数M, N中间用空格分隔(1 <= M < N <= 10^9)

Output

输出一个数K,满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。

Input示例

2 3

Output示例

2

扩展欧几里得模板题!

#include<iostream>using namespace std;typedef long long LL;void exgcd(LL a,LL b,LL &x,LL &y)    //带入得到  a*x+b*y=gcd(a,b) {    if(b==0)     //当b==0的时候  a*x=gcd(a,b)=a 因此x=1     {        x=1;        y=0;        return;    }    exgcd(b,a%b,x,y);    //当b>0的时候  x=y  y=x-(a/b)*y     LL ans=x;    x=y;    y=ans-(a/b)*y;}int main(){    LL m,n,x,y;    while(cin>>m>>n)    {        exgcd(m,n,x,y);    //列出等式  m*x+n*y=gcd(m,n)         cout<<(x%n+n)%n<<endl;    }    return 0;} 
0 0