比赛的时候没有做出来,今天补题的时候看了大佬的代码,也不至于太难理解,但当时就是没想出来,只能说大佬牛逼。
K取余C,余下的部分用A和B补。先预处理出X个A取余C的所以情况,每种情况各需要几个A,B同样预处理出来,然后让X个A和Y个B取余C的余数凑出K取余C的余数即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c,k;
ll yua[100500],yub[100500];
int main(){
scanf("%lld %lld %lld %lld",&a,&b,&c,&k);
memset(yua,-1,sizeof(yua));
memset(yub,-1,sizeof(yub));
for(ll i=0,cut=0;i<c;++i,cut+=a){
if(yua[cut%c]==-1)yua[cut%c]=i;
}
for(ll i=0,cut=0;i<c;++i,cut+=b){
if(yub[cut%c]==-1)yub[cut%c]=i;
}
ll need=k%c;
for(ll i=0;i<c;++i){
ll x=yua[i],y=yub[(need-i+c)%c];
if(x==-1||y==-1){
continue;
}
if(a*x+b*y<=k){
printf("%lld %lld %lld",x,y,(k-a*x-b*y)/c);
return 0;
}
}
}