求助
查看原帖
求助
160839
Prean楼主2021/2/20 23:55

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);
    }
}
2021/2/20 23:55
加载中...