题目大意:有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; }