整理關於 \(\rm{ax+by=c}\),遇到的一系列
在這里,\(x\) ,\(y\) 是變量,\(a,\;b,\;c\) 是常量
前置:
對於二元一次不定方程 \(ax+by=c\),有整數解的充要條件是 \((a,b)|c\) ;
設 \(a=\frac a{gcd(a,b)}\), \(b=\frac b{gcd(a,b)}\),\(c=\frac c{gcd(a,b)}\),則此時 \(gcd(a,b)=1\);
若 \(gcd(a,b)=1\),且不定方程 \(ax+by=c\) 有整數解 \(x=x_0,\,y=y_0\) ,則它的一切整數解可表示成:
\[x=x_0+bt\\y=y_0-at\;(t\in \rm Z) \]exgcd可求得 \(ax+by=gcd(a,b)\)的特解,\(x_0,\,y_0\)
所以 \(ax+by=c\)的特解可表示成 :
\[x_0=x_0\cdot\frac{c}{gcd(a,b)}=x_0\cdot c\\ y_0=y_0\cdot\frac{c}{gcd(a,b)}=y_0\cdot c \]由 \(\rm 3\)可得 \(ax+by=c\) 的通解 \(x,\,y\)
設以下, \(ax+by=c\) 中,均是 \(gcd(a,b)=1\)。
1,求 \(\rm{ax+by=c}\), \(x\)的最小正整數解
設 \(x_1\) 為 \(x\) 的最小正整數解,則 \(x_1\) :
2, 求 \(\rm{ax+by}\) 的最大不可解 \(\rm c\),且滿足 \(\rm{x>0,y>0}\) : \(\rm{c=a\times b}\)
3, 求 \(\rm{ax+by}\) 的最大不可解 \(\rm c\) , 且滿足 \(\rm{x\geq0,y\geq0}\) : \(\rm{c=a\times b-a-b}\)
2,3的證明見洛谷P3951題解
4,求 \(\rm{ax+by+cz=k}\) 的任意一組解,且滿足 \(\rm{x\geq0,y\geq0,z\geq0}\) :
其中:\(1\leq a,b,c\leq10^5 ,0\leq k\leq 10^{12}\) ,保證數據有解
\(ax+by=k-cz\) 有解的前提是 \(gcd(a,b)|(k-cz)\),則需枚舉z使得滿足條件\(gcd(a,b)|(k-cz)\)下,可解的符合的 \(x,\,y\)。
設 \(g=gcd(a,b)\) \(ec=k\%g\),則所求的 \(z\) 需滿足\(zc-tg=ec\),且 \(z\geq0\)。
所以求出最小 \(z\),再枚舉滿足通項公式的 \(z\),直到有解。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=2e5+5;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){
x=1;y=0;
return a;
}
ll g=exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-a/b*y;
return g;
}
void solve(ll a,ll&b,ll c,ll&x,ll&y)
{
ll g=__gcd(a,b),x0,y0;
a/=g;b/=g;c/=g;
exgcd(a,b,x0,y0);
x0*=c;y0*=c;
x=x0+b;//y=y0-a;
x=(x%abs(b)+abs(b))%abs(b);y=(c-a*x)/b;
}
int main()
{
ll a,b,c,k,g,ec,x,y,z,t,tb,tk,ttb;
scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
g=__gcd(a,b);
ec=k%g;
tb=-g;
solve(c,tb,ec,z,t);
tb=abs(tb);
do{
tk=k-z*c;ttb=b;
solve(a,ttb,tk,x,y);
if(x>=0&&y>=0)
{
printf("%lld %lld %lld\n",x,y,z);
break;
}
z+=tb;
}while(1);
}