51nod 1256 乘法逆元

给出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

思路:

拓展欧几里得算法;(欧几里得精彩)//视频讲解欧几里得

核心之处在于它会找到x*m+y*n=gcd(n,m);//但是n和m必须互质才有解;

用欧几里得能找出来x和y   题意是k*m%n==1;(我知道卫聚聚要看我的博客求卫聚聚指出不当之处orz卫聚聚)

可以变成k*m-t*n==1;那么通过对比x*m+y*n=gcd(n,m);因为n和m互质那么gcd(n,m)==1;

发现x就是k;那么我们只需知道x就可以了但是x可能会是负数;所以我们就将他加上n也就是模;这样直到它为正就可以了;

因为x就相当于k;我们将他加上n;它在模n还是一样的结果;

下面附上蒟蒻的代码:

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll x,y;
ll eggcd(ll m,ll n)
{
    if(n==0)
    {
        x=1;
        y=0;
        return m;
    }
    int r=eggcd(n,m%n);
    int t=x;
    x=y;
    y=t-(m/n)*y;
    return r;
}
int main()
{
    ios::sync_with_stdio(false);
    ll n,m;
    while(cin>>m>>n)
    {
        eggcd(m,n);
        while(x<0)
        {
            x+=n;
        }
        cout<<x<<endl;
    }
    return 0;
}

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页