同余方程
线性同余方程,也就是给定a,b,m,求一个整数x满足a*x≡b(mod m)a*x≡b(mod m)
,然后因为ax≡b(mod m)ax≡b(mod m)等价于
ax−b是m的倍数,不妨设y为一个负数,那么这个方程可以改写为ax+m*y=b
于是 我们可以通过拓展欧几里得算法求出特解,然后(x%b+b)%b(x%b+b)%b来达到最小值的效果.
如例题:
题目描述
求关于x的同余方程ax≡1(modb)ax≡1(modb)的最小正整数解。
输入格式
输入只有一行,包含两个正整数a,b,用一个空格隔开。
输出格式
输出只有一行,包含一个正整数x,表示最小正整数解。
输入数据保证一定有解。
数据范围
2≤a,b≤2∗1092≤a,b≤2∗109
样例
输入样例:
3 10
输出样例:
7
给出代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
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 t=x;x=y;y=t-y*(a/b);
return d;
}
int main()
{
cin>>A>>B;
ex_gcd(A,B,x,y);
cout<<(x%B+B)%B<<endl;//得到最小的
return 0;
}