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; }
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; }
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; }
时间: 2024-10-09 22:14:31