WA求助
查看原帖
WA求助
389192
andychen_2012楼主2022/4/19 18:34

完全照着式子打的代码

看了题解,几乎完全一样,但就是在下面这个数据错了:

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;
}

2022/4/19 18:34
加载中...