裴蜀定理:
若给出参数a,b,ca,b,ca,b,c,不定方程ax+by=cax+by=cax+by=c有解的充要条件是
gcd(a,b)∣c
gcd(a,b)|c
gcd(a,b)∣c
证明:
gcd(a,b)gcd(a,b)gcd(a,b)显然是axaxax的一个因子,也是bybyby的一个因子,所以ax+byax+byax+by的含义为gcd(a,b)gcd(a,b)gcd(a,b)的两个倍数相加,结果一定还是gcd(a,b)gcd(a,b)gcd(a,b)的倍数,所以只需要gcd(a,b)∣cgcd(a,b)|cgcd(a,b)∣c,方程就有解
同样的原理,可以扩展至任意个数的参数:
给出nnn个参数aia_{i}ai与ccc,使方程
∑i=1naixi=c
\sum_{i=1}^{n}a_{i}x_{i}=c
i=1∑naixi=c
有解的充要条件是
gcd(a1,a2,...,an)∣c
gcd(a_{1},a_{2},...,a_{n})|c
gcd(a1,a2,...,an)∣c
例题:洛谷P4549P4549P4549
题意:
给出nnn个参数aia_{i}ai,求另一个整数序列xix_{i}xi,使得
S=∑i=1naixi
S=\sum_{i=1}^{n}a_{i}x_{i}
S=i=1∑naixi
满足S>0S>0S>0,且SSS最小
Solution:
显然右式是一个不定方程,那么SSS要存在取值就只可能是gcd(a1,a2,...,an)gcd(a_{1},a_{2},...,a_{n})gcd(a1,a2,...,an),这个就是答案了。不过aia_{i}ai可能是负的,只需要取负aia_{i}ai在计算就可以保证是正的了
// #include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bitset>
#include<map>
using namespace std;
using ll=long long;
using ull=unsigned long long;
const int N=2e5+5,inf=0x3fffffff;
const long long INF=0x3fffffffffffffff,mod=1e9+9;
int main()
{
#ifdef stdjudge
freopen("in.txt","r",stdin);
#endif
int ans,n; cin>>n>>ans;
if(ans<0) ans=-ans;
while(--n)
{
int x; cin>>x;
if(x<0) x=-x;
ans=__gcd(ans,x);
}
cout<<ans;
return 0;
}
本文介绍了裴蜀定理,即不定方程ax+by=c有解的充要条件是gcd(a,b)|c,并通过此定理解决了一类找最小正解的问题。在给定多个参数的情况下,该定理同样适用,要求gcd所有参数|c。示例中展示了如何运用裴蜀定理找到使序列和S大于0且最小的整数序列x_i。
979

被折叠的 条评论
为什么被折叠?



