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

[51nod1256]乘法逆元

时间:2017-05-27 10:39:13      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:span   拓展   while   ext   define   nod   .com   欧几里得   bsp   

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]乘法逆元

标签:span   拓展   while   ext   define   nod   .com   欧几里得   bsp   

原文地址:http://www.cnblogs.com/elpsycongroo/p/6911156.html

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