对比了一下题解,感觉好像都一样啊,不知道为什么全WA /youl
样例也能过的,求大佬指点
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const ll inv2=499122177;
const ll inv6=166374059;
struct node
{
ll f,g,h;
};
node solve(ll a, ll b, ll c, ll n,ll mod)
{
node ans,tmp;
if(a==0)
{
ans.f=(n+1)*(b/c)%mod;
ans.g=(b/c)*n%mod*(n+1)%mod*inv2%mod;
ans.h=(b/c)*(b/c)%mod*(n+1)%mod;
return ans;
}
else if(a>=c||b>=c)
{
tmp=solve(a%c,b%c,c,n,mod);
ans.f=(tmp.f+(a/c)*n%mod*(n+1)%mod*inv2%mod+(b/c)*(n+1)%mod)%mod;
ans.g=(tmp.g+(a/c)*n%mod*(n+1)%mod*(2*n+1)%mod*inv6%mod+(b/c)*n%mod*(n+1)%mod*inv2%mod)%mod;
ans.h=((a/c)*(a/c)%mod*n%mod*(n+1)%mod*(2*n+1)%mod*inv6%mod+(b/c)*(b/c)%mod*(n+1)%mod+(a/c)*(b/c)%mod*n%mod*(n+1)%mod+tmp.h+2*(a/c)%mod*tmp.g%mod+2*(b/c)%mod*tmp.f%mod)%mod;
return ans;
}
else
{
ll m=(a*n+b)/c;
tmp=solve(c,c-b-1,a,m-1,mod);
ans.f=(n*(m%mod)%mod-tmp.f)%mod;
ans.g=(n*(n+1)%mod*(m%mod)%mod-tmp.f-tmp.h)%mod*inv2%mod;
ans.h=(n*(m%mod)%mod*((m+1)%mod)%mod-2*tmp.g-2*tmp.f-ans.f)%mod;
return ans;
}
}
inline ll read()
{
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
f=-f;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*f;
}
int main()
{
ll t,mod=998244353;
t=read();
while(t--)
{
ll a,b,c,n;
n=read(),a=read(),b=read(),c=read();
node answer=solve(a,b,c,n,mod);
printf("%lld %lld %lld\n",(answer.f+mod)%mod,(answer.h+mod)%mod,(answer.g+mod)%mod);
}
return 0;
}