把x遍历一遍,然后把转化为关于y,z的yb+zc=(k-xa)的二元一次方程(exgcd模板题),exgcd求解 
   用exgcd求出的是y0,然后转成y(放大(k-xa)/gcd倍),这里的t是y的最小增幅 
 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c,x,y,z,d,s,k,ym;
int exgcd(ll a,ll b,ll &x,ll &y){
    if(!b){
        x=1, y=0;
        return a;
    }
    int d;
    d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
int main(){
	
	cin>>a>>b>>c>>k;
	for(int i=0;i*a<=k;i++){
		s=k-i*a;
		d=__gcd(b,c);
		if(s%d) continue;
		d=exgcd(b,c,y,z);
		y=y*s/d;//y0转y
		ll t=c/d;
		y=(y%t+t)%t;//y的最小正整数解
		if(s%d==0&&k-i*a-b*y>=0){
			cout<<i<<" "<<y<<" "<<(k-i*a-b*y)/c<<endl;;
			return 0;
		}
	}
	return 0;
}   其实比赛暴力莽就完事了,就看你比赛敢不敢交 
   当然也要缩小下暴力范围 
   额,😓这题比赛时的数据有点弱,遍历y(1~k),z然后用if(k-y*b-z*c)%a==0可以莽过去,但是遍历x,y求z或者遍历x,z求y就会tel 
   当然我也是莽过去的 
   创作不易,
(你懂的) 

京公网安备 11010502036488号