Codeforces 757 C Felicity is Coming!

题目大意:有n个训练营,m种宠物,每个训练营里里面有gi 个宠物,现在每只宠物都要完成一次进化,种类

相同的宠物进化之后,种类还是相同,种类不同的宠物不能进化成相同种类,且要求所有宠物进化之后,每个

训练营各个种类的宠物数量不变。

思维题

思路:我们不能一个一个训练营考虑,我们要考虑不同种类宠物的情况,我们统计每种宠物出现在那个训练营

里面且出现几次,统计结果完全一样的宠物种类分为一堆,这一堆里面的宠物如果有x个,则这堆的贡献为x!

将所有堆得结果想乘就是结果。

原来将vector<int> vec[ N ] 排序,sort(vec,vec+N),是每个按字典序排序,学到了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5;
const ll mod=1e9+7;
int n,m;
ll f[N];
vector<int> cnt[N];
int main()
{
    cin>>n>>m;
    f[0]=1;
    for(ll i=1;i<=m;i++) f[i]=(f[i-1]*i)%mod;
    for(int i=1;i<=n;i++)
    {
        int g; scanf("%d",&g);
        while(g--)
        {
            int w; scanf("%d",&w);
            cnt[w].push_back(i);
        }
    }
    sort(cnt+1,cnt+1+m);
    int c=1;
    ll ans=1;
    for(int i=2;i<=m;i++)
    {
        if(cnt[i]==cnt[i-1])
        {
            c++;
            if(i==m) ans=(ans*f[c])%mod;
        }
        else
        {
            ans=(ans*f[c])%mod;
            c=1;
        }
    }
    cout<<ans<<endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/CJLHY/p/7381667.html