正题
题目大意
有n张试卷m道题,给出每张试卷每道题的答案(A或B),选择若干道题,要求至少有k对试卷这些题的选择不一样(只要有一题不一样就行)
解题思路
用二进制码表示试卷,用1表示A,0表示B。
然后用二进制码枚举这些题的选择方案,用1表示选,0表示不选。
然后∨\vee∨一下就可以单独得出每张试卷这些题的选择。
之后直接比较就可以得知选择是否相同。
我们可以用一个同viv_ivi选择的表示为i的试卷个数,然后用总对数减去多出来对数就可以得到有多少对试卷不一样。
code
#include<cstdio>
#include<cstring>
#include<iostream>
#define MS 1024
#define N 1010
using namespace std;
int t,n,m,k,v[MS],a[N],ans,answer;
char c;
int main()
{scanf("%d",&t);for(int ti=1;ti<=t;ti++){answer=0;memset(a,0,sizeof(a));scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>c;a[i]=a[i]*2+(c=='A');//转换}for(int s=0;s<(1<<m);s++)//枚举状态{ans=0;memset(v,0,sizeof(v));for(int i=1;i<=n;i++)//枚举试卷{v[a[i]&s]++;//统计ans+=i-v[a[i]&s];//容斥}if(ans>=k) answer++;}printf("%d\n",answer);}
}