传送门
巨佬zyd出的一道题
裴蜀定理:对于正整数a,b,方程ax+by=c有解的充分必要条件为gcd(a,b)∣c
我们设gcd(a,b)=d,\fr\dfracd = a′,\frac\dfrac= b′,\frac{c\dfracc′
首先证明充分条件:
若gcd(a,b)∣c则c′为整数,
原方程两边同时除以d,方程化为:a′x+b′y=c′,即a′x=c′(modb′),
显然a′,b′两两互质,根据extgcd,我们知道这个方程一定有整数解。
充分性得证
再证明必要条件:
用反证法
若gcd(a,b)不整除c则c′不为整数,
原方程两边同时除以d,方程化为:a′x+b′y=c′,
等式左边为整数,右边不为整数,所以无解。
必要性得证
回到本题,发现这是一种裴蜀定理推广到n个数的情况
即a1x1+a2x2+a3x3...anxn=b有解的充分必要条件为gcd(a1,a2,a3...an)∣b
又因为b为正整数,所以bmin=gcd(a1,a2,a3...an)
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <bits/stdc++.h> using namespace std; inline int read(){ int x=0; char ch=getchar(); while (ch<'0'||ch>'9'){ ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x; } int gcd(int jzm,int xjp){ return jzm%xjp==0?xjp:gcd(xjp,jzm%xjp); } int main(){ int n=read(); int ans=read(); for (register int i=2;i<=n;++i){ ans=gcd(ans,read()); } printf("%d\n",ans); }
|