同余方程

题目描述

求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。

输入

输入只有一行,包含两个正整数 a, b,用一个空格隔开。

输出

输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。

样例输入

3 10

样例输出

7

提示

对于 100%的数据,2 ≤a, b≤ 2,000,000,000。

 

题目即为逆元的定义

费马小定理不适用

 逆元 http://www.cnblogs.com/linyujun/p/5194184.html

#include <iostream>
#include <bits/stdc++.h>
#define LL long long
using namespace std;
long long a,mod;
//long long quickpow(long long a,long long b)
//{
//    if(b<0) return 0;
//    long long ret=1;
//    a%=mod;
//    while(b)
//    {
//        if(b&1) ret =(ret*a)%mod;
//        b>>=1;
//        a = (a*a)%mod;
//    }
//    return ret;
//}
//
//long long inv(long long a)
//{
//    return quickpow(a,mod-2);
//}//费马小定理适用条件:mod为质数

LL exgccd(LL a,LL b,LL &x,LL &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    LL g,t;
    g = exgccd(b,a%b,x,y);
    t = x;
    x = y;
    y = t-a/b*y;
}

LL inv(LL b,LL p)
{
    LL x,y;
    exgccd(b,p,x,y);
    return x = (x%p+p)%p;
}

int main()
{
    cin>>a>>mod;
    cout<<inv(a,mod)<<endl;
    return 0;
}

 

posted @ 2018-03-20 12:45  Albert_liu  阅读(186)  评论(0编辑  收藏  举报