没有题面。
看到这个坑爹的数据量(最多10个班级),大概会对状压有一些想法(反正我是没想到)。(本题暴搜可得50分)
从数据量可以看出:状态压缩压缩的是已选择的班级而不可能是班服种类。
DP[i][j] 表示 前i种班服到达状态j的方案数。
首先,如果不选第i种班服,那么DP[i][j]=DP[i-1][j]
如果要选第i种班服,那么一定要在可选班服列表中有第i种班服的班级中选择。
怎么判断?
状态j中有第k个班,并且k班的待选列表中有第i种班服。
若满足上述条件,那么DP[i][j]+=DP[i-1][(1<<(k-1))^j]。
答案在哪里?
若有n个班,班服编号最大为maxx,那么答案就是 DP[maxx][(1<<n)-1]
附上AC代码

1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 template<class T> inline bool read(T &_a){ 6 int _ch=getchar();_a=0; 7 while(_ch<'0' || _ch>'9')_ch=getchar(); 8 while(_ch>='0' && _ch<='9'){_a=(_a<<1)+(_a<<3)+_ch-'0';_ch=getchar();} 9 return _ch==' '; 10 } 11 12 const long long modx=1000000007; 13 long long T,n,dp[101][1<<10|1],ans,s[101],all; 14 int maxx; 15 16 inline void solve() 17 { 18 for (register int i=1;i<=maxx;++i) 19 for (register int v=0;v<=all;++v) 20 { 21 dp[i][v]=dp[i-1][v]; 22 for (register int k=0;k<n;++k) 23 if((v&1<<k)&&(s[i]>>k&1)) 24 dp[i][v]+=dp[i-1][1<<k^v],dp[i][v]%=modx; 25 } 26 } 27 28 int main() 29 { 30 freopen("shirt.in","r",stdin); 31 freopen("shirt.out","w",stdout); 32 for (read(T);T;--T) 33 { 34 read(n); 35 memset(dp,0,sizeof(dp)); 36 memset(s,0,sizeof(s)); 37 maxx=0; all=(1<<n)-1; 38 dp[0][0]=1; 39 for (register int i=1,col;i<=n;++i) 40 { 41 while(read(col)) s[col]|=(1<<i-1),maxx=max(maxx,col); 42 maxx=max(maxx,col); 43 s[col]|=(1<<i-1); 44 } 45 solve(); 46 printf("%lld ",dp[maxx][all]); 47 } 48 return 0; 49 }