20pts 容斥球调
查看原帖
20pts 容斥球调
648933
HarmonicQuadrilatera楼主2023/7/5 10:17
#include<bits/stdc++.h>
#define int long long
#define M 1000003
#define N 15
#define L 50
using namespace std;
int T,n,k,l,C[N+5][N+5];
char c[N+5][L+5],app;
inline int solve(int x)
{
	int res=1;
	for(int i=1;i<=l;i++)
	{
		app='!';
		for(int j=1;j<=n;j++)
			if((x>>(j-1))&1)
				if(c[j][i]!='?')
				{
					if(app=='!') app=c[j][i];
					else return 0;
				}
		if(app=='!') res=res*26%M;
	}
	return res;
}
signed main()
{
	for(int i=0;i<=N;i++)
	{
		C[i][0]=1;
		for(int j=1;j<=i;j++)
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%M;
	}
	cin>>T;
	while(T--)
	{
		cin>>n>>k;
		for(int i=1;i<=n;i++)
			scanf("%s",c[i]+1);
		l=strlen(c[1]+1);
		int ans=0;
		for(int i=0;i<(1<<n);i++)
		{
			int pc=0;
			for(int j=0;j<n;j++)
				if(i&(1<<j)) pc++;
			if(pc>=k)
			{
				int sig=(pc-k)&1?-1:1;
				ans=(ans+sig*C[pc][k]*solve(i))%M;
			}
		}
		ans=(ans+M)%M;
		printf("%lld\n",ans);
	}
	return 0;
}

写得和第三篇题解一模一样,但还是 wa 了……

2023/7/5 10:17
加载中...