題解 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; }