1. 程式人生 > 實用技巧 >洛谷p1082 同餘方程

洛谷p1082 同餘方程

洛谷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;
}

結束