球条(50pts+#3#5MLE)
查看原帖
球条(50pts+#3#5MLE)
1010650
Expert_Dreamer楼主2025/1/15 19:09
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 15000001
#define mod 998244353
#define sum a+b+c
int a,b,c,k,ans,P[N],F[N],G[N],G3[N],f[N],g[N],h[N];
int qmi(int a,int b){
	int c=1;
	for(;b;b>>=1){
		if(b&1)c=c*a%mod;
		a=a*a%mod;
	}
	return c;
}
int C(int n,int m){
	if(m<0||m>n)return 0;
	return F[n]*G[n-m]%mod*G[m]%mod;
}
void init(){
    F[0]=1;
	for(int i=1;i<=sum;i++) F[i]=F[i-1]*i%mod;
	G[sum]=qmi(F[sum],mod-2);
    G3[sum]=qmi(qmi(3,sum),mod-2);
	for(int i=sum-1;i>=0;i--) G[i]=G[i+1]*(i+1)%mod,G3[i]=3*G3[i+1]%mod;
	for(int i=0;i<=max(a+b,max(a+c,b+c));i++) P[i]=qmi(i,k);
	f[0]=g[0]=h[0]=1;
}
void work(){
    for(int t=1;t<=a+b;t++) f[t]=(2*f[t-1]%mod-C(t-1,t-b-1)+mod-C(t-1,a)+mod)%mod;
	for(int t=1;t<=a+c;t++) g[t]=(2*g[t-1]%mod-C(t-1,t-c-1)+mod-C(t-1,a)+mod)%mod;
	for(int t=1;t<=b+c;t++) h[t]=(2*h[t-1]%mod-C(t-1,t-c-1)+mod-C(t-1,b)+mod)%mod;
}
void calc(){
    for(int p=0;p<=a+b;p++) ans=(ans+C(sum-p,c)*G3[sum-p]%mod*f[a+b-p]%mod*P[p]%mod)%mod;
	for(int p=0;p<=a+c;p++) ans=(ans+C(sum-p,b)*G3[sum-p]%mod*g[a+c-p]%mod*P[p]%mod)%mod;
	for(int p=0;p<=b+c;p++) ans=(ans+C(sum-p,a)*G3[sum-p]%mod*h[b+c-p]%mod*P[p]%mod)%mod;
}
signed main(){
	cin>>a>>b>>c>>k;
    init();
	work();
	calc();
	cout<<ans*G3[1]%mod;
}
2025/1/15 19:09
加载中...