定理:對於給定的正整數a,b,方程有解的充要條件為c是gcd(a,b)的整數倍
證明:
充分性證明:
設gcd(a,b)=d,於是設,
其中k1,k2互質
那么原等式等價於,即
,其中k1,k2互質
那么這個方程等價於模線性方程,由拓展gcd知,該方程一定有解
那么該方程的一組解即為原方程的解
必要性證明:
采用反證法,假設c不是gcd(a,b)的倍數,於是:
設
那么:
兩邊同時除以d,有:
由於k1,x,k2,y,k3均為整數,而顯然不是整數,故原方程無解
這與方程有解矛盾,故c一定為gcd(a,b)的倍數
定理的推廣:
方程(其中a,b,c...n,f為整數)有解的充要條件是f為gcd(a,b,c,...,n)的整數倍
定理的應用:
給定一個序列{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;
}