RT,wa#6#7,不知道错在哪儿了/kk
code:
#include<cstdio>
const int mod=998244353;
int T,n,a,b,c;
struct Q{
int a,b,c;
}ans;
inline int Add(const int&a,const int&b){
return a+b>=mod?a+b-mod:a+b;
}
inline int Del(const int&a,const int&b){
return a-b<0?a-b+mod:a-b;
}
inline int mo(const int&a){
return a-(a>=mod)*mod;
}
inline int div2(const int&a){
return a+(a&1)*mod>>1;
}
inline int div3(const int&a){
return (a+1ll*(a%3)*mod)/3;
}
inline int S1(const int&n){
return div2(1ll*n*(n+1)%mod);
}
inline int S2(const int&n){
return div2(div3(1ll*n*(n+1)%mod*mo(n<<1|1)%mod));
}
Q Query(const int&n,const int&a,const int&b,const int&c){
if(!a)return (Q){1ll*(b/c)*(n+1)%mod,1ll*(b/c)*(b/c)%mod*(n+1)%mod,1ll*(b/c)*S1(n)%mod};
int m=((1ll*a*n+b)/c)%mod;Q it,ans;
if(a>=c||b>=c){
int ta=a/c,tb=b/c,s1=S1(n),s2=S2(n);
it=Query(n,a%c,b%c,c);
ans.a=Add(it.a,Add(1ll*s1*ta%mod,1ll*(n+1)*tb%mod));
ans.c=Add(it.c,Add(1ll*s2*ta%mod,1ll*s1*tb%mod));
ans.b=Add(it.b,Add(Add(1ll*ta*ta%mod*s2%mod,1ll*tb*tb%mod*(n+1)%mod),
mo(Add(1ll*ta*tb%mod*s1%mod,Add(1ll*ta*it.c%mod,1ll*tb*it.a%mod))<<1)));
return ans;
}
else{
it=Query(m-1,c,c-b-1,a);
ans.a=Del(1ll*n*m%mod,it.a);
ans.b=Add(mo(Del(1ll*n*S1(m-1)%mod,it.c)<<1),ans.a);
ans.c=Del(1ll*S1(n)*m%mod,div2(Add(it.a,it.b)));
return ans;
}
}
signed main(){
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&n,&a,&b,&c);
ans=Query(n,a,b,c);
printf("%d %d %d\n",ans.a,ans.b,ans.c);
}
}