思路是对于攻击牌和强化牌枚举他们打与不打的分界,然后算组合数。(连n≤10都过不了就很离谱。。。)
#include<bits/stdc++.h>
#define N 3030
#define mod 998244353ll
using namespace std;
typedef long long ll;
ll T,n,m,k,jc1[N],jc2[N],a[N],b[N],f1[N][N],f2[N][N],an1[N],an2[N],ans;
ll power(ll x,ll y)
{
ll res=1;
while(y)
{
if(y&1) res=res*x%mod;
x=x*x%mod;y>>=1;
}
return res;
}
bool cmp(ll x,ll y)
{
return x>y;
}
ll C(ll x,ll y)
{
if(y>x) return 0;
return jc1[x]*jc2[y]%mod*jc2[x-y]%mod;
}
int main()
{
freopen("data.out","r",stdin);
jc1[0]=jc2[0]=1;
for(int i=1;i<=3000;i++)
{
jc1[i]=jc1[i-1]*i%mod;
jc2[i]=power(jc1[i],mod-2);
}
cin>>T;
while(T--)
{
ans=0;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
sort(a+1,a+n+1,cmp);
sort(b+1,b+n+1,cmp);
if(k==1)
{
for(int i=1;i<=n;i++)
ans=(ans+C(2*n-i,m-1)*b[i])%mod;
cout<<ans<<endl;continue;
}
for(int i=0;i<=n;i++)
f1[i][0]=1,f2[i][0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
f1[i][j]=(f1[i-1][j-1]*a[i]+f1[i-1][j])%mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
f2[i][j]=(f2[i-1][j]+f2[i-1][j-1]+C(i-1,j-1)*b[i])%mod;
memset(an1,0,sizeof(an1));
memset(an2,0,sizeof(an2));
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
ll x=min(k-2,i*1ll-1);
an1[i]=(an1[i]+f1[j-1][x]*a[j]%mod*C(n-j,i-x-1))%mod;
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
ll x;
if(m-i>=k-1) x=1;
else x=k-m+i;
an2[i]=(an2[i]+(f2[j-1][x-1]+b[j]*C(j-1,x-1)%mod)*C(n-j,i-x))%mod;
}
for(int i=1;i<m;i++)
ans=(ans+an1[i]*an2[m-i])%mod;
ans=(ans+an2[m])%mod;
cout<<ans<<endl;
}
return 0;
}