#include<bits/stdc++.h>
#define I inline
#define RI register int
#define rep(i,a,b) for(RI i=a;i<=b;++i)
#define dow(i,a,b) for(RI i=a;i>=b;--i)
using namespace std;
const int N=3e6+5,mo=998244353,inv2=499122177,inv6=166374059;
struct node{ int f,g,h; node(){ f=h=g=0; } };
I int add(int x,int y){ return x+y>=mo?x+y-mo:x+y; }
I int sub(int x,int y){ return x-y<0?x-y+mo:x-y; }
I int mul(int x,int y){ return 1ll*x*y%mo; }
I int C2(int n){ return 1ll*n*(n+1)/2%mo; }
I int C3(int n){ return 1ll*n*(n+1)%mo*(2*n+1)%mo*inv6%mo; }
int T,n,a,b,c;
I node query(int a,int b,int c,int n){
node ans,now;
if(!a){
ans.f=mul(b/c,n+1);
ans.g=mul(b/c,C2(n));
ans.h=mul(mul(b/c,b/c),n+1);
return ans;
}
if(a>=c||b>=c){
now=query(a%c,b%c,c,n);
ans.f=add(now.f,add(mul(b/c,n+1),mul(a/c,C2(n))));
ans.g=add(now.g,add(mul(a/c,C3(n)),mul(b/c,C2(n))));
ans.h=add(mul(C3(n),mul(a/c,a/c)),add(mul(mul(b/c,b/c),n+1),add(mul(mul(2,a/c),now.g),
add(mul(mul(2,b/c),now.f),add(mul(mul(2,a/c),mul(b/c,C2(n))),now.h)))));
return ans;
}
RI m=1ll*(a*n+b)/c;
now=query(c,c-b-1,a,m-1);
ans.f=sub(mul(n,m),now.f);
ans.g=mul(inv2,sub(mul(m,mul(n,n+1)),add(now.f,now.h)));
ans.h=sub(sub(mul(n,mul(m,m+1)),mul(2,add(now.g,now.f))),ans.f);
return ans;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&n,&a,&b,&c);
node k=query(a,b,c,n);
printf("%d %d %d\n",k.f,k.h,k.g);
}
return 0;
}
这个代码只有 30 pts,但是 #define int long long 之后就有 100 pts。
那么请问我代码哪里没取模到呢?