P1082 同余方程
阿新 • • 發佈:2018-08-27
int 相等 cst while gcd () space line clu
題意:給定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-\lfloor\frac{a}{b}\rfloor*b$
所以$ax+by=bx‘+(a-\lfloor\frac{a}{b}\rfloor*b)y‘$
$a(x)+b(y)=a(y‘)+b(x‘-\lfloor\frac{a}{b}\rfloor*y‘)$
對應相等
$x=y‘$
$y=x‘-\lfloor\frac{a}{b}\rfloor*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 同余方程