同余方程
题意:求满足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); }