51nod 1256 乘法逆元 (模板)

来源:互联网 发布:精子优化处理检查 编辑:程序博客网 时间:2024/05/17 10:57


给出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,ylong 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;}





0 0