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;
}


阅读更多
个人分类: 51nod 知识点
想对作者说点什么? 我来说一句

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

不良信息举报

51nod 1256 乘法逆元

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭