裴蜀定理(貝祖定理) 證明與應用


定理:對於給定的正整數a,b,方程a*x+b*y=c有解的充要條件為c是gcd(a,b)的整數倍

證明:

充分性證明:

設gcd(a,b)=d,於是設a=k1*d,b=k2*dc=k3*d其中k1,k2互質

那么原等式等價於k1*d*x+k2*d*y=k3*d,即k1*x+k2*y=k3,其中k1,k2互質

那么這個方程等價於模線性方程\begin{matrix} k1*x & \equiv & k3 &mod & k2 \end{matrix},由拓展gcd知,該方程一定有解

那么該方程的一組解即為原方程的解

必要性證明:

采用反證法,假設c不是gcd(a,b)的倍數,於是:

a=k1*d,b=k2*d,c=k3*d+c{}'

那么:

k1*d*x+k2*d*y=k3*d+c{}'

兩邊同時除以d,有:

k1*x+k2*y=k3+\frac{c{}'}{d}

由於k1,x,k2,y,k3均為整數,而\frac{c{}'}{d}顯然不是整數,故原方程無解

這與方程有解矛盾,故c一定為gcd(a,b)的倍數

定理的推廣:

方程ax+by+cz+...+nm=f(其中a,b,c...n,f為整數)有解的充要條件是f為gcd(a,b,c,...,n)的整數倍

定理的應用:

給定一個序列{an},求一個整數序列{bn}使得a1*b1+a2*b2+...+an*bn值最小(要求最小值為正數),求這個最小值

解:根據裴蜀定理的推廣,原式最小值即為gcd(a1,a2...an)

代碼(luogu4549):

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
int n;
int gcd(int x,int y)
{
    if(y==0)
    {
        return x;
    }
    return gcd(y,x%y);
}
int main()
{
//  freopen("min.in","r",stdin);
//  freopen("min.out","w",stdout);
  scanf("%d",&n);
  int ans=0;
  for(int i=1;i<=n;i++)
    {
      int x;
      scanf("%d",&x);
      x=abs(x);
      if(x==0)
      {
      	continue;
      }
      ans=gcd(x,ans);
    }
  printf("%d\n",ans);
  return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM