#include #include #include using namespace std; struct Node { int v[3],dist; inline bool operator < (const Node& b) const { return dist > b.dist; } }; const int maxn=200+5; int vis[maxn][maxn],cap[3],ans[maxn]; void update_ans(const Node& u) { for(int i=0;i<3;i++) { int d=u.v[i]; if(ans[d]<0||u.dist q; Node start; start.dist=0; start.v[0]=0;start.v[1]=0;start.v[2]=c; q.push(start); vis[0][0]=1; while(q.size()>0) { Node u=q.top(); q.pop(); update_ans(u); if(ans[d]>=0) break; for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(i!=j) { if(u.v[i]==0||u.v[j]==cap[j]) continue; int amount=min(cap[j],u.v[i]+u.v[j])-u.v[j]; Node u2; memcpy(&u2,&u,sizeof(u)); u2.dist=u.dist+amount; u2.v[i]-=amount; u2.v[j]+=amount; if(!vis[u2.v[0]][u2.v[1]]) { vis[u2.v[0]][u2.v[1]]=1; q.push(u2); } } } while(d>=0) { if(ans[d]>=0) { printf("%d %d\n",ans[d],d); return; } d--; } } int main() { int T,a,b,c,d; scanf("%d",&T); while(T-->0) { scanf("%d%d%d%d",&a,&b,&c,&d); solve(a,b,c,d); } return 0; }