CH3301 同余方程

题意

描述

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

输入格式

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

输出格式

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

样例输入

3 10

样例输出

7

数据范围与约定

  • 对于 40% 的数据    2 ≤b≤1,000
    对于 60% 的数据    2 ≤b≤50,000,000
    对于 100%的数据    2 ≤a, b≤2,000,000,000

来源

CCF NOIP2012 D2T1

分析

相当于解\(ax+by=1\),exgcd找到一组特殊解,把x在模b意义下转成正的就行了。

时间复杂度\(O(\log a)\)

代码

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
    rg T data=0,w=1;
    rg char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(isdigit(ch))
        data=data*10+ch-'0',ch=getchar();
    return data*w;
}
template<class T>il T read(rg T&x){
    return x=read<T>();
}
typedef long long ll;
ll exgcd(ll a,ll b,ll&x,ll&y){
    if(!b) {x=1,y=0;return a;}
    ll d=exgcd(b,a%b,x,y);
    ll z=x;x=y;y=z-y*(a/b);
    return d;
}
int main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    ll a,b,x,y;
    read(a),read(b);
    exgcd(a,b,x,y);
    printf("%lld\n",(x%b+b)%b);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/autoint/p/10443615.html