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

定理:对于给定的正整数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 @   lleozhang  Views(2864)  Comments(0Edit  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
levels of contents
点击右上角即可分享
微信分享提示