洛谷p1082 同餘方程
阿新 • • 發佈:2020-08-25
洛谷1082 同餘方程
\[a x \equiv 1 \pmod {b} \]
根據同餘式的定義,我們可以知道一個一次同餘方程一定可以寫成
ax+by=c的不定方程形式
簡單證一下吧
比如
\[a x \equiv c \pmod {b} \]
我們引入一個變數k,根據mod運算的性質,我們可知該式一定可以寫為:ax-kb=c的形式
我們定義y=-k;所以該式就變為了:ax+by=c的形式。
我們根據貝祖定理可知:給出兩個數a,b,設d=gcd(a,b),則一定有ax+by=d。因為ax,by,一定是d的倍數,所以ax+by=c中的c也一定是d的倍數
即然c是d 的倍數,那麼一定有
\[c \equiv 0 \pmod d \]
我們再回到題上去看
本題中我們的c 是1那一定有1%gcd(a,b)=0;所以我們可以得出
若同餘方程有解,則gcd(a,b)=1
接下來方程就轉化為ax+by=d的形式
我們要求出最小的x,擴歐跑一遍
因為我們要求的是最小的X(所得到的x有可能為負或不為最小)我們對所得的x處理一下輸出即可
程式碼如下
#include<iostream> #include<cstdio> using namespace std; long long x,y,a,b; void exgcd(long long a,long long b){ if(b==0){ x=1; y=0; return ; } exgcd(b,a%b); long long tmp=x; x=y; y=tmp-a/b*y; } int main(){ cin>>a>>b; exgcd(a,b); x=(x%b+b)%b; cout<<x; return 0; }
結束