码迷,mamicode.com
首页 > 其他好文 > 详细

14求逆元模板

时间:2015-08-19 19:12:18      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

kb2.4.1扩展欧几里德法

技术分享
#include<iostream>
#include<stdio.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 a,n;
    scanf("%lld%lld",&a,&n);
    printf("%lld\n",mod_reverse(a,n));
    return 0;
}
View Code

kb2.4.1简洁写法

注意:这个只能求a<m的情况,而且必须保证a和m互质

技术分享
#include<iostream>
#include<stdio.h>
using namespace std;

//求ax=1(mod m)的x值,就是逆元(0<a<m)
long long inv(long long a,long long m){
    if(a==1)return 1;
    return inv(m%a,m)*(m-m/a)%m;
}

int main(){
    long long a,m;
    scanf("%lld%lld",&a,&m);
    printf("%lld\n",inv(a,m));
    return 0;
}
View Code

kb2.4.3利用欧拉函数

mod为素数,而且a和m互质

技术分享
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;

long long inv(long long a,long long mod){//为素数mod
    //return pow_m(a,mod-2,mod);
    return int(pow(a,mod-2))%mod;
}

int main(){
    long long a,mod;
    scanf("%lld%lld",&a,&mod);
    printf("%lld\n",inv(a,mod));
    return 0;
}
View Code

 

14求逆元模板

标签:

原文地址:http://www.cnblogs.com/bofengyu/p/4742682.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!