解析:
ax+by+cz=k
ax+by=k-cz
这不就是形如ax+by=c
所以用扩展欧几里得求解就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c,k;
ll x,y;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1;y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
return d;
}
int main()
{
scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
for(int i=0;i<k/c;i++)
{
ll d=exgcd(a,b,x,y);
ll p=k-c*i;
if(p%d) continue;
x=x*(p/d);//扩大若干倍
y=y*(p/d);//扩大若干倍
x=(x%(b/d)+(b/d))%(b/d); //最小正整数解
y=(p-a*x)/b; //ax+by=p y=(p-a*x)/b
if(x>=0&&y>=0)
{
printf("%lld %lld %lld\n",x,y,i);
break;
}
}
}