完全照着式子打的代码
看了题解,几乎完全一样,但就是在下面这个数据错了:
1
926081700 570288700 101010101 922746500
输出
485564169 718002855 681544787
我的输出是:
485564169 680511891 888789112
求帮忙看看吧:
#include<cstdio>
typedef long long ll;
const ll p=998244353;
struct num{
ll f,g,h;
num(){f=g=h=0;}
};
ll inv2=499122177;
ll inv6=166374059;
inline num calc(ll a,ll b,ll c,ll n){
ll ac=a/c,bc=b/c,m=(a*n+b)/c,n1=n+1,n2=2*n+1;
ll n21=n*n1%p,n22=n*n1*n2%p;
ll ac2=ac*ac%p,bc2=bc*bc%p,abc=ac*bc%p;
num d;
if(a==0){
d.f=bc*n1%p;
d.g=bc*n21%p*inv2%p;
d.h=bc2*n1%p;
return d;
}
// if(n==0){
// d.f=bc%p;
// d.g=0;
// d.h=bc*bc%p;
// return d;
// }
if(a>=c||b>=c){
d.f=n21*inv2%p*ac%p+bc*n1%p;
d.g=n22*ac%p*inv6%p+bc*n21%p*inv2%p;
d.h=n22*ac2%p*inv6%p+bc2*n1%p+abc*n21%p;
d.f%=p;
d.g%=p;
d.h%=p;
num e=calc(a%c,b%c,c,n);
d.h+=e.h+2*bc*e.f%p+2*ac*e.g%p;
d.g+=e.g;
d.f+=e.f;
d.f%=p;
d.g%=p;
d.h%=p;
return d;
}
num e=calc(c,c-b-1,a,m-1);
d.f=n*m%p-e.f;
d.f=(d.f%p+p)%p;
d.g=m*n21%p-e.h-e.f;
d.g=(d.g*inv2%p+p)%p;
d.h=n*m%p*(m+1)%p-2*e.g-2*e.f-d.f;
d.h=(d.h%p+p)%p;
return d;
}
ll a,b,c,n;
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld%lld",&n,&a,&b,&c);
num ans=calc(a,b,c,n);
printf("%lld %lld %lld\n",ans.f,ans.h,ans.g);
}
return 0;
}