题意:已知有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;
}