#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5,mod=998244353;
const int inf=0x3f3f3f3f3f3f3f3f;
int Pow(int a,int b){
int ans=1;
while(b){
if(b&1)ans=ans*a%mod;
b>>=1,a=a*a%mod;
}
return ans;
}
void solve(){
vector<int> arr(26);
int sum=0,sum1,sum2;
for(int& c:arr)cin>>c,sum+=c;
sum1=sum/2;
sum2=(sum+1)/2;
vector<int> dp(sum+1);
dp[0]=1;
//dp求解每种字符选和不选使得总和为sum有多少种情况
for(int i=0;i<26;i++){
if(arr[i]){
for(int j=sum;j>=arr[i];j--){
dp[j]=dp[j]+dp[j-arr[i]];
}
}
}
//初始化阶乘和阶乘的逆元
vector<int> fac(sum+1),inv(sum+1);
fac[0]=inv[0]=fac[1]=1;
for(int i=2;i<=sum;i++)fac[i]=fac[i-1]*i%mod;
inv[sum]=Pow(fac[sum],mod-2);
for(int i=sum-1;i>=1;i--)inv[i]=inv[i+1]*(i+1)%mod;
int ans=dp[sum1]*fac[sum1]%mod*fac[sum2]%mod;
for(int i=0;i<26;i++)ans=ans*inv[arr[i]]%mod;
cout<<ans<<"\n";
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t=1;
cin>>t;
while(t--)solve();
cout.flush(),system("pause");
return 0;
}
D. Even String
最新推荐文章于 2025-08-27 22:16:59 发布