求助,只有40分但写了二三问,过了样例
查看原帖
求助,只有40分但写了二三问,过了样例
553501
可爱的小棉羊楼主2024/1/11 15:17
#include<bits/stdc++.h>
using namespace std;
struct data{
	long long f,g,h;
};
const int mod=998244353;
data euclid(long long a,long long b,long long c,long long n){
	data ans;
	if(a==0){
		ans.f=(b/c)*(n+1)%mod;
		ans.g=(n+1)*(b/c)%mod*(b/c)%mod;
		ans.h=n*(n+1)/2%mod*(b/c)%mod;
	}else if(a>=c||b>=c){
		data p=euclid(a%c,b%c,c,n);
		ans.f=(n*(n+1)/2%mod*(a/c)%mod+(n+1)%mod*(b/c)%mod+p.f)%mod;
		ans.g=(p.g+2*(a/c)%mod*p.h%mod+2*(b/c)%mod*p.f%mod+(__int128)n*(n+1)*(2*n+1)/6%mod*(a/c)%mod*(a/c)%mod+n*(n+1)/2%mod*(a/c)%mod*(b/c)%mod+(n+1)*(b/c)%mod*(b/c)%mod)%mod;
		ans.h=(p.h+(__int128)n*(n+1)*(2*n+1)/6%mod*(a/c)%mod+n*(n+1)/2%mod*(b/c)%mod)%mod;
	}else{
		long long m=(a*n+b)/c;
		data p=euclid(c,c-b-1,a,m-1);
		ans.f=((n*(m%mod)%mod-p.f)%mod+mod)%mod;
		ans.g=(((n*m%mod*(m+1)%mod-ans.f)%mod-2*p.h%mod-2*p.f%mod)%mod+mod)%mod;
		ans.h=(((__int128)m*n*(n+1)-p.g-p.f)/2%mod+mod%mod)%mod;
	}
	return ans;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		long long a,b,c,n;
		cin>>n>>a>>b>>c;
		data ans=euclid(a,b,c,n);
		cout<<ans.f<<" "<<ans.g<<" "<<ans.h<<endl;
	}
}
2024/1/11 15:17
加载中...