首页 > 代码库 > [51nod1256]乘法逆元

[51nod1256]乘法逆元

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256

解题关键:设$m \in {N_ + }$,则$a$在模$m$的意义下存在唯一的逆元,若$(a,m) \ne 1$,则$a$没有模$m$的逆元;

法一:费马小定理求解${a^{\phi (p)}} = 1\bmod p$

 1 #include<bits/stdc++.h> 2 #define PI  acos(-1.0) 3 using namespace std; 4 typedef long long ll; 5 ll mod_pow(ll x,ll n,ll p){ 6     ll res=1; 7     while(n){ 8         if(n&1) res=res*x%p; 9         x=x*x%p;10         n>>=1;11     }12     return res;13 }14 ll euler_phi(int n){15     int res=n;16     for(int i=2;i*i<=n;i++){17         if(n%i==0){18             res=res/i*(i-1);19             while(n%i==0) n/=i;20         }21     }22     if(n!=1) res=res/n*(n-1);23     return res;24 }25 26 27 int main(){28     int a,b;29     cin>>a>>b;30     ll m=euler_phi(b)-1;31     ll ans=mod_pow(a,m,b);32     cout<<ans<<endl;33     return 0;34 }

法二:拓展欧几里得算法求解

注意x可能为负,但不会超过-b

 1 #include<bits/stdc++.h> 2 #define PI  acos(-1.0) 3 using namespace std; 4 typedef long long ll; 5 ll x,y; 6 ll extgcd(ll a,ll b,ll &x,ll &y){ 7     ll d=a; 8     if(b){ 9         d=extgcd(b,a%b,y,x);10         y-=a/b*x;11     }12     else{13         x=1,y=0;14     }15     return d;16 }17 int main(){18     int a,b;19     cin>>a>>b;20     extgcd(a,b,x,y);21     cout<<(x+b)%b<<endl;22     return 0;23 }

 

[51nod1256]乘法逆元