裴蜀定理注意点
定理描述:如果有两个整数a,b,则有整数x和y使得 ax+by=gcd(a,b)成立
题目来源:P4549 【模板】裴蜀定理
此题是模板题,一眼丁真为裴蜀定理
解题思路:对于A学序列a1,a2 有a1x1+a2x2=gcd(a1,a2)
为什么abs(gcd(a1,a2))为此状态的最小结果呢?可以简单反证一下
我们只研究a1,a2>0的情况
a1>=gcd(a1,a2) a2>=gcd(a1,a2),故x1+1或x2+1都比原结果大,x1-1,x2-1都会导致结果为负数
所以对于序列A,只需要求出gcd(a1,a2),gcd(a3,gcd(a1,a2))…就可以得到最终结果
注意要判断除数是否为0,要不然会re
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
if(a%b==0) return b;
else return gcd(b,a%b);
}
int main(void){
int n;cin>>n;
int t;cin>>t;if(t<0) t=-t;
for(int i=2;i<=n;++i){
int p;cin>>p;
if(p==0) continue;//重点,因为自己写的gcd没有考虑b为零
if(p<0) p=-p;
if(t<p) swap(t,p);
t=gcd(t,p);
}
cout<<t<<endl;
return 0;
}