同余方程

题目链接

题意:求满足a*x≡1(mod b)的最小整数x。

思路:由线性同余方程的基本性质,ax≡1(modb)ax≡1(modb)当且仅当gcd(a, b) = 1时才有解。由Bézout定理,有ax+by=1ax+by=1,可以先利用扩展欧几里得算法求出一组特解x0,y0x0,y0,然后通过取模把范围降到1~b之间即可。x有可能为负数,但负数模b还是负数,因此(x%b+b)%b处理。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
using namespace std;
ll a,b,x,y;
ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return a;
    }
    ll d=ex_gcd(b,a%b,x,y);
    ll z=x;
    x=y;
    y=z-y*(a/b);
    return d;
}
int main()
{
    x=0;
    y=0;
    scanf("%lld%lld",&a,&b);
    ex_gcd(a,b,x,y);
    printf("%lld\n",(x%b+b)%b);
 } 

 

posted @ 2019-08-05 22:12  Ldler  Views(282)  Comments(0Edit  收藏  举报