NOIp提高組 2012 同餘方程————擴展歐幾里得定理

題解:本題主要考查擴展歐幾里得定理。
簡要題意:求ax1(modb)a x \equiv 1 \pmod {b}最小正整數解
1.擴展歐幾里得定理:ax1(modb)a x \equiv 1 \pmod {b},等價與ax+my=1a*x+m*y=1
因爲裴蜀定理ax+by=z,gcd(a,b)zax+by=z,則gcd(a,b)|zgcd(a,b)=1;gcd(a,b)=1;
又因爲gcd(a,b)=gcd(b,amod  b)gcd(a,b)=gcd(b,a\mod b)所以bx1+(amod  b)y1=gcd;b*x_1+(a\mod b)*y_1=gcd;
又因爲amod  b=a(a/b)b;a\mod b=a-(a/b)*b;
所以bx1+(a(a/b)b)y1b*x1 + (a-(a/b)*b)*y1
=bx1+ay1(a/b)by1= b*x1+a*y1–(a/b)*b*y1
=ay1+b(x1a/by1)=gcd= a*y_1 + b*(x1 – a/b*y1) = gcd
所以x=y1,y=x1a/by1;x=y_1,y=x1 – a/b*y1;
因此到最後,如果xx太小就不斷加bb直到大於等於00,太大則一直減bb,直到最小正整數解。直接求模實現更快。
(其實暴力也可,親測70分QwQ)
代碼如下:

#include<iostream>
#include<cstdio>
using namespace std;
long long a,b,x,xx,y;
void exgcd(long long a,long long b)
{
	if(b==0)
	{
		x=1;y=0;
		return ;
	}
	exgcd(b,a%b);
	xx=x;x=y;y=xx-(a/b)*y;
	return ;
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>a>>b;
	exgcd(a,b);
	cout<<(x+b)%b;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章