题解 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;
}
posted @ 2020-08-29 10:34  ADay526  阅读(378)  评论(0)    收藏  举报