Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined), problem: (C) Felicity is Coming! Solution in C/C++

#include<stdio.h>
#include<stdlib.h>
#define m 1000000007u
typedef long long unsigned llu;
typedef unsigned u;
int C(const void*x,const void*y){return*(u*)x-*(u*)y;}
int D(const void*x,const void*y)
{
	if(*(llu*)x>*(llu*)y)return 1;
	if(*(llu*)x<*(llu*)y)return-1;
	return 0;
}
llu H[1111111],P[1111111];
u F[1111111],Q[1111111];
int main()
{
	u t,q,n,i,j,r=1;
	for(F[i=0]=1;++i<1111111;)F[i]=i*(llu)F[i-1]%m;
	for(P[i=0]=1;++i<1111111;)P[i]=m*P[i-1]+1;
	for(scanf("%u%u",&t,&n);t--;)
	{
		scanf("%u",&q);
		for(i=-1;++i<q;)scanf("%u",Q+i);
		qsort(Q,q,sizeof(u),C);Q[q]=-1u;
		for(j=i=0;++i<=q;)if(Q[i]!=Q[j])
		{
			H[Q[j]-1]+=(i-j)*P[t];
			j=i;
		}
	}
	qsort(H,n,sizeof(llu),D);H[n]=-1llu;
	for(j=i=0;++i<=n;)if(H[i]!=H[j])
	{
		
		r=r*(llu)F[i-j]%m;
		j=i;
	}
	printf("%u\n",r);
	return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *