1. 程式人生 > >P1082 同余方程

P1082 同余方程

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 同余方程