裴蜀定理(贝祖定理) 证明与应用

定理:对于给定的正整数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;
}

 

posted @ 2018-10-04 08:32  lleozhang  Views(2562)  Comments(0Edit  收藏  举报
levels of contents