好菜啊,完全没有思路,没有想到那个X^3是突破点,(x1+x2+x3+xn)*(x1+x2+xn)*(x1+x2+xn)那么我们只要枚举i,j,k不管顺序,然后看着m个按钮按或不按,对xi,xj,xk都为1,才对答案有贡献,于是状态压缩对i,j,k一蛤就是0-8,于是复杂度是n^3*m*8。
#include<bits/stdc++.h>
#define maxl 51
#define mod 1000000007
using namespace std;
int n,m,cas;
long long ans;
long long s[maxl];
long long f[maxl][8];
inline void prework()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
s[i]=0;
int k,x;
for(int i=1;i<=m;i++)
{
scanf("%d",&k);
for(int j=1;j<=k;j++)
{
scanf("%d",&x);
s[i]|=(1ll<<x);
}
}
}
inline void mainwork()
{
long long tmp;ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
memset(f,0,sizeof(f));
f[0][0]=1;
for(int ii=1;ii<=m;ii++)
for(int t=0;t<8;t++)
{
tmp=t;
if(s[ii]&(1ll<<i)) tmp^=1;
if(s[ii]&(1ll<<j)) tmp^=2;
if(s[ii]&(1ll<<k)) tmp^=4;
f[ii][t]+=f[ii-1][t];
f[ii][t]+=f[ii-1][tmp];
}
ans=(ans+f[m][7])%mod;
}
}
inline void print()
{
printf("Case #%d: %lld\n",cas,ans);
}
int main()
{
int t;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}