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


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

    那么这个方程等价于模线性方程egin{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
    ",ans);
      return 0;
    }
    
  • 相关阅读:
    使用Dorado框架开发必备参考
    Dorado重用最佳实践
    css布局_web
    dorado学习笔记(二)
    Oracle归档日志删除
    给大家拜年啦!
    悟透JavaScript
    BCM57781网卡驱动下载地址
    win7安装jdk完后配置
    win7删除SVN保存的本地密码
  • 原文地址:https://www.cnblogs.com/zhangleo/p/10764192.html
Copyright © 2020-2023  润新知