Noip草稿紙1

擴展歐幾里得

ax1+by1=gcd(a,b)...1ax_1+by_1 = gcd(a,b)...1

gcd(a,b)=gcd(b,a%b)...2gcd(a,b)=gcd(b,a\%b)...2

bx2+(a%b)y2=gcd(b,a%b)...3bx_2+(a\%b)y_2=gcd(b,a\%b)...3

ax1+by1=bx2+(a%b)y2...4ax_1+by_1=bx_2+(a\%b)y_2...4

a%b=aa/bb...5a\%b=a-a/b*b...5

ax1+by1=bx2+(aa/bb)y2...6ax_1+by_1=bx_2+(a-a/b*b)y_2...6

ax1+by1=ay2+b(x2a/by2)...7ax_1+by_1=ay_2+b(x_2-a/b*y_2)...7

x1=y2x_1=y_2

y1=x2a/by2y_1=x_2-a/b*y2

int exgcd(int a,int b,int &x,int &y) {
	if(b == 0) {
		x = 1;
		y = 0;
		return a;
	}
	int x2,y2;
	int g = exgcd(b,a%b,x2,y2);
	x = y2;
	y = x2-a/b*y2;
	return g;
}

中國剩餘定理

xai(%mi)...1x \equiv a_i(\%m_i)...1

M=i=1nmi...2M = \prod_{i = 1}^{n}{m_i}...2

Mmiti1(%mi)...3\frac{M}{m_i}t_i\equiv1(\%m_i)...3

x=i=1nMmitiai+kM...4x = \sum_{i=1}^{n}\frac{M}{m_i}t_ia_i+k*M...4

最小非負整數解爲(x%M+M)%M(x\%M+M)\%M

可以用擴展歐幾里得求逆元.

int crt(int a[],int m[],int n) {
	int M = 1,ans = 0;
	for(int i = 0;i < n;++i) M *= m[i];
	for(int i = 0;i < n;++i) {
		int Mi = lcm/m[i];
		exgcd(Mi,m[i],x,y);
		ans = (ans + Mi%M*x%M*a[i]%M+M)%M;
	}
	if(ans < 0 ) ans += M;
	return ans;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章