1. 程式人生 > 實用技巧 >題解 P4549 【【模板】裴蜀定理】

題解 P4549 【【模板】裴蜀定理】

實際發表時間:2020-04-20
https://www.luogu.com.cn/problem/P4549
此題是裴蜀定理的模板題,那麼——先上定理內容:

對任何整數\(a\)\(b\)和它們的最大公約數\(d\),關於未知數\(x\)\(y\)的線性不定方程(稱為裴蜀等式):若\(a\),\(b\)是整數,且\(\gcd(a,b)=d\),那麼對於任意的整數\(x,y,ax+by\)都一定是d的倍數,特別地,一定存在整數\(x\),\(y\),使\(ax+by=d\)成立。
——百度百科

emm,說白了,其實就是兩個東西:

\[\begin{cases}\text{任意}x,y→\gcd(a,b)|ax+by\\ax+by=\gcd(a,b)\text{有整數解}\end{cases} \]

其中\(a,b,x,y\)均為整數

證明

引理①:我已經化成那個樣子了,原因顯然。
引理②證明:

\[\text{設}t=\gcd(a,b),\text則 t|a,t|b,t|ax+by \]

\[\text設 s\text{為}ax+by\text{的最小正整數值, 那麼$s$為$a,b$的線性組合} \]

\[\text{設}r=a\%s,p=\left\lfloor\dfrac{a}{s}\right\rfloor \]

\[\therefore r=a-ps=a-p(ax+by)=a(1-px)-pby \]

\[\text{顯然$r$也是$a,b$的線性組合} \]

\[\text{又 $\because s$ 最小,則$r$=0} \]

\[\text{$\therefore s|a,s|b,$那麼$s$為$a,b$的公因數 $\rightarrow t \ge s$} \]

\[\text{$\because t|ax+by$} \]

\[\text{$\therefore t|s$} \]

\[\therefore t \le s \]

\[\text{$\because t \ge s,t \le s$} \]

\[\therefore t=s \]

略去過程QED,由上可知證畢。

回到題目

顯然,\(s\)即為所求。那麼\(n\)個數的裴蜀定理怎麼弄?每個數的絕對值\(\gcd\)一次即可。

程式碼:

#include<bits/stdc++.h>
using namespace std;

inline int read()//快讀
{
	int s=0,f=1;
	char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		s=(s<<3)+(s<<1)+ch-48;
		ch=getchar();
	}
	return s*f;
}

inline void write(int x)//快寫
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10^48);
}

int n,ans;

int main()//美麗的主程式
{
	n=read(),ans=read();//ans預設為第一個數
	while(--n)ans=__gcd(ans,abs(read()));//懶得手寫gcd,雖然NOIP不能用
	write(ans);//輸出
	return 0;
}