AK_HuangYC的博客

人一我十,人十我百

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

#include<bits/stdc++.h>
using namespace std;
//返回d=gcd(a,b);和对应于等式ax+by=d中的x,y
long long extend_gcd(long long a,long long b,long long &x,long long &y)
{
    if(a==0&&b==0) return -1;//无最大公约数
    if(b==0){x=1;y=0;return a;}
    long long d=extend_gcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
//*********求逆元素*******************
//ax = 1(mod n)
long long mod_reverse(long long a,long long n)
{
    long long x,y;
    long long d=extend_gcd(a,n,x,y);
    if(d==1) return (x%n+n)%n;
    else return -1;
}

int main()
{
	long long n,m;
	cin>>n>>m;
	cout<<mod_reverse(n,m)<<endl;
	return 0;
}



q神的模板:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int euler(int x)
{
    int res=x;
    for(int i=2;i<=(int)sqrt(x);i++)
    {
        if(x%i==0)
        {
            res=res/i*(i-1);
            while(x%i==0)x/=i;
        }
    }
    if(x!=1)
    {
        res=res/x*(x-1);
    }
    return res;
}
int inv(int a,int p)
{
    int res=1,t=euler(p)-1;
    while(t>0)
    {
        if(t&1)res=1LL*res*a%p;
        a=1LL*a*a%p;
        t>>=1;
    }
    return res;
}
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    printf("%d\n",inv(m,n));
    return 0;
}





阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/h1021456873/article/details/49456715
个人分类: 51nod
想对作者说点什么? 我来说一句

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

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