http://codeforces.com/contest/757/problem/C
题目大意:有n个导管,每个体育馆有k种神奇宝贝,然后所有的n个体育馆中,一共有m中神奇宝贝。可知,每个神奇宝贝中都可以相互转化。问,有多少种转化方式,使得每个体育馆里面的所有类型的数目不变(可以所有的不转化)
思路:我第一次知道vector竟然可以通过hash的方式来解决问题!!!
定义vector<int> ve[i]表示第i种神奇宝贝属于哪些道馆,然后我们sort(ve + 1, ve + 1 + m),再判断ve[i] == ve[i-1]即可。
//看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> #pragma comment(linker,"/STACK:102400000,102400000") #define LL long long #define ALL(a) a.begin(), a.end() #define pb push_back #define mk make_pair #define fi first #define se second #define haha printf("haha ") const int maxn = 1e6 + 5; std::vector<int> ve[maxn]; const LL mod = 1e9 + 7; int n, m; int main(){ std::cin >> n >> m; for (int i = 1; i <= n; i++){ int k; scanf("%d", &k); while (k--){ int u; scanf("%d", &u); ve[u].push_back(i); } } std::sort(ve + 1, ve + 1 + m); LL ans = 1, cnt = 1; for (int i = 2; i <= m; i++){ if (ve[i] == ve[i - 1]){ ans = ans * (++cnt) % mod; } else cnt = 1; } std::cout << ans << std::endl; return 0; }