#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=14;
int a[maxn][maxn]={0};
int f[(1<<maxn)][maxn][maxn]={0};
int kjc=1;
int main()
{
int T;
cin>>T;
int cnt=1;
while(T--)
{
memset(a,0,sizeof a);
memset(f,0,sizeof f);
printf("Case %d:\n",cnt++);
int n,kk,q;
cin>>n>>kk>>q;
int maxs=(1<<n);
for(int i=0;i<n;i++)
{
int t;
cin>>t;
int x;
while(t--)
{
cin>>x;
a[x-1][i]=1;
}
}
for(int i=0;i<n;i++)
f[1<<i][i][0]=1;
for(int s=2;s<maxs;s++)
{
int maxdis=-1;
{
int x=s;
while(x>0)
{
maxdis+=x&1;
x>>=1;
}
}
if(maxdis==0) continue;
for(int i=0;i<n;i++)
{
if((s&(1<<i))==0) continue;
int news=s^(1<<i);
for(int k=0;k<n;k++)
{
if(((1<<k)&news)==0) continue;
if(a[k][i]==0) f[s][i][0]+=f[news][k][0];
for(int j=1;j<=maxdis;j++) f[s][i][j]+=f[news][k][j-a[k][i]];
}
}
}
kjc=1;
if(kk==0)
{
for(int i=1;i<=n;i++) kjc*=i;
}
while(q--)
{
int r;
cin>>r;
if(kk==0)
{
cout<<kjc<<endl;
}
else
{
int ans=0;
for(int i=0;i<n;i++)
for(int j=0;j*kk<=r;j++) ans+=f[maxs-1][i][j];
cout<<ans<<endl;
}
}
}
}
lightoj1228
最新推荐文章于 2021-10-27 21:43:32 发布