题意
3301 同余方程 0x30「数学知识」例题
描述
求关于 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;
}