51Nod 1256 乘法逆元

题意:给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。

解题思路:乘法逆元板子题,但是用费马小定理的板子WA了,只过了部分数据...然后换了扩展欧几里得的板子就过了...

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define INF 0x3f3f3f3f
#define PI acos(-1.0)
typedef long long ll;
//扩展欧几里得算法
void exgcd(ll a,ll b,ll& d,ll& x,ll& y)
{
    if(!b){d=a;x=1;y=0;}
    else{exgcd(b,a%b,d,y,x);y-=x*(a/b);}
}
//求逆元
ll inv(ll a,ll p)
{
    ll d,x,y;
    exgcd(a,p,d,x,y);
    return d==1?(x+p)%p:-1;
}
int main()
{
    ll n,mod;
    while(scanf("%I64d%I64d",&n,&mod)==2)
    {
        printf("%I64d\n",inv(n,mod));
    }
    return 0;
}

 

 

 

你可能感兴趣的:(OJ刷题)