P1082 同余方程
Posted olinr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1082 同余方程相关的知识,希望对你有一定的参考价值。
题意:给定a,b,求$ax equiv 1 pmod b$的最小正整数解x,保证有解
exgcd:求$ax+by=gcd(a,b)$的 一组解x,y
首先根据正常的gcd可得出 $gcd(a,b)=gcd(b,a\%b)$
假设我们已经得到了一组解x‘ y‘
则 $bx‘+(a\%b)y‘=gcd(b,a\%b)$
则 $ax+by=gcd(a,b)=gcd(b,a\%b)=bx‘+(a\%b)y‘$
而且$a\%b=a-lfloorfrac{a}{b} floor*b$
所以$ax+by=bx‘+(a-lfloorfrac{a}{b} floor*b)y‘$
$a(x)+b(y)=a(y‘)+b(x‘-lfloorfrac{a}{b} floor*y‘)$
对应相等
$x=y‘$
$y=x‘-lfloorfrac{a}{b}
floor*y‘$
一直递归求解,若b=0
则x=1 y=0 就行了
对于方程 $ax equiv b pmod c$有解,当且仅当gcd(a,c)|b
所以对于此题gcd(a,b)|1
额
貌似给你ab互质了啊
所以。。。。
直接用
ax+by=gcd(a,b)=1
求解就行了
#include<cstdio> #include<iostream> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define int long long #define olinr return #define _ 0 #define love_nmr 0 #define DB double inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if(ch==‘-‘) f=-f; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } inline void put(int x) { if(x<0) { x=-x; putchar(‘-‘); } if(x>9) put(x/10); putchar(x%10+‘0‘); } inline void exgcd(int a,int b,int &x,int &y) { if(!b) { x=1; y=0; return; } exgcd(b,a%b,x,y); int t=x-a/b*y; x=y; y=t; } signed main() { int a,b,x,y; a=read(); b=read(); exgcd(a,b,x,y); while(x<0) x+=b; put(x); olinr ~~(0^_^0)+love_nmr; }
以上是关于P1082 同余方程的主要内容,如果未能解决你的问题,请参考以下文章