#include using namespace std; #define rep(i,a,b) for(ll i=a;i=b;i--) #define ll long long #define ull unsigned ll #define ld long double #define bl __int128_t #define fi first #define se second #define vel vector #define vvel vector #define pll pair #define vepll vector #define vvepll vector #define ves vector #define vem vector #define vvem vector #define pmm pair #define bl __int128_t #define cleout(i) cout<using PQ=priority_queue,greater>; // 上 右 下 左 vector di={-1, 0, 1, 0}; vector dj={ 0, 1, 0,-1}; vector dx={ 0, 1, 0,-1}; vector dy={ 1, 0,-1, 0}; vector ddx={ 1, 1, 1, 0, -1, -1, -1, 0 }; vector ddy={ 1, 0, -1, -1, -1, 0, 1, 1 }; ll inf=1000000000000000000;//1e18 // LLONG_MAX mt19937_64 rng((ull)chrono::steady_clock::now().time_since_epoch().count()); //[x^M]1/(1-x)^N=comb(N-1+M,M) pll solve(ll N,ll A,ll B,ll X,ll Y){ ll ok=0; ll ng=N+1; if(X+Y<0&&A<0)return {A*N+X,Y};//ずっと下がる if(X+Y>=0&&B<=0)return {X,Y-B*N};//ずっと増える if(X+Y<0&&B<0){//A>=0 if(N*A+X+Y<0){ return {A*N+X,Y}; } ng=N;//+Aする回数 while(ng-ok>1){ ll mid=(ok+ng)/2; if(X+Y+A*mid>=0)ng=mid; else ok=mid; } return {A*ng+X,Y-B*(N-ng)}; } if(X+Y>=0&&A<0){//B>=0 if(X+Y-N*B>=0){ return {X,Y-B*N}; } ng=N;//-Bする回数 while(ng-ok>1){ ll mid=(ok+ng)/2; if(X+Y-B*mid<0)ng=mid; else ok=mid; } return {A*(N-ng)+X,Y-B*ng}; } //この時点でA>0かつB>0になっている if(A*N+X+Y=-B)return {X,Y-B*N}; //+Aされる回数をokとして二分探索 while(ng-ok>1){ ll mid=(ok+ng)/2; if(X+Y+A*mid-B*(N-mid)>N>>X>>Y>>A>>B; pll ans=solve(N,A,B,X,Y); cout<>_; else _=1; rep(__,0,_){ _solve(); } }