本机数据全对,交上去全WA??
查看原帖
本机数据全对,交上去全WA??
546289
Link_Cut_qwq楼主2022/5/20 22:56

思路是对于攻击牌和强化牌枚举他们打与不打的分界,然后算组合数。(连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;
}

2022/5/20 22:56
加载中...