题意:已知有m种口袋精灵,n个体育场,每个体育场有g[i]个精灵(已知类别),现在要求进行精灵进化。进化的要求有:进化后,每个体育馆的精灵物种以及数量不能发生改变。问最多有多少种可能性。
思路:要满足,物种以及数量不改变的情况下,假定a进化为b,b进化为a。那么对于所有的体育馆来说,A的数量==B的数量。对于A、B精灵的出现集合一定要一一对应,不能多,不能少。
这样我们开个vector来存储每个动物出现的体育馆号。然后sort vector 使得长度相等并且所有元素都相等的vector 就是满足条件的情况。如果有n个连续成立的,那么可能性就是n! 。 然后求一下最后的结果,注意爆int和取mod
CODE:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+50;
const int MOD=1e9+7;
vector <int> a[maxn];
int main(void)
{
int n,m;
cin >> n >>m;
for(int i=1;i<=m;i++)
a[i].clear();
for(int i=1;i<=n;i++)
{
int t;
scanf("%d",&t);
while(t--)
{
int type;
scanf("%d",&type);
a[type].push_back(i);
}
}
sort(a+1,a+1+m);
/* for(int i=1;i<=m;i++)
{
printf("i=%d ",i);
for(int j=0;j<a[i].size();j++)
printf("%d ",a[i][j]);
}*/
ll ans=1,t=1;
for(int i=2;i<=m;i++)
{
if(a[i]==a[i-1]) t++,ans*=t%MOD,ans%=MOD;
else t=1;
}
cout << ans << endl;
}