【模板】貝祖定理
阿新 • • 發佈:2019-03-22
scanf limit main 因此 多少 print gcd i++ can
題目大意:給定一個由 N 個元素組成的序列,現給 N 個元素加上 N 個系數,使得 \(\sum\limits_{1\le i\le n}a_ib_i\) 取得最小正數,求這個最小正數是多少。
題解:由貝祖定理可知,對於任意兩個正整數 a, b,一定存在 x, y,使得 ax+by=gcd(a,b) 成立,且 gcd(a,b) 為該不定方程的最小正整數。因此,前兩個數的最小表示為 gcd(a,b),因此可以用 gcd(a,b) 代替前兩個數,因為不存在比 gcd(a,b) 更優的解了。依次往下遞推即可得到答案,有點類似於最優子結構。。qwq
代碼如下
#include <bits/stdc++.h> using namespace std; int n,ans; int gcd(int a,int b){ return b?gcd(b,a%b):a; } int main(){ scanf("%d",&n); for(int i=1,res;i<=n;i++){ scanf("%d",&res); if(res<0)res=-res; ans=gcd(ans,res); } printf("%d\n",ans); return 0; }
【模板】貝祖定理