Cod sursa(job #509576)

Utilizator cristiprgPrigoana Cristian cristiprg Data 11 decembrie 2010 13:28:00
Problema Colorare3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define MOD 1000000007
#define DIM 100005
long long n, k;

struct muc
{
	long long u, v;
	friend bool operator < (const muc &a,const muc &b)
	{
		if (a.u < b.u)	return true;
		else
			if ((a.u == b.u) && (a.v < b.v))	return true;
		return false;
	}
} muchii[DIM];

struct ar
{
	long long n, k;
} A[DIM];

void read()
{
	FILE *f = fopen("colorare3.in", "r");
	fscanf(f, "%lld%lld", &n, &k);
	for (long long  m = 0, i = 1, x, y; i <= n-1; ++i)
	{
		fscanf(f, "%lld%lld", &x, &y);
		muchii[++m].u = x;
		muchii[m].v = y;
		muchii[++m].u = y;
		muchii[m].v = x;
	}
	fclose(f);
}

int main()
{
	read();
	sort(muchii + 1, muchii + 2*n - 2);
	long long  i, j, sarite, count = 0;
	/*
	for (int i = 1; i <= 2*(n-1); ++i)
		printf("%d %d\n", muchii[i].u, muchii[i].v);
	printf("||--------||\n");
	*/
	for (long long q = 1; q <= 2*(n-1); ++q)
	{
		i = muchii[q].u;
		
		sarite = 0;
		for (j = q; j <= 2*(n-1) && muchii[j].u == i; ++j)
			if (muchii[j].u > muchii[j].v)
				++sarite;
		
		if (k - sarite != k-j+q)
		{
			A[++count].n = k - sarite;
			A[count].k = k-j+q;
		//	printf("i=%d %d %d\n",count, A[count].n, A[count].k);
		}
		
		q = j-1;
	}
	
	long long  rez =1, a;
	for (long long  i = 1; i <= count; ++i) //PLM!
	{
		a = 1;
		for (j = A[i].k+1; j <= A[i].n; ++j)
			a = (a*j)%MOD;
		
		rez = (rez*a)%MOD;
	}

	FILE *f = fopen("colorare3.out", "w");
	fprintf(f, "%lld\n", rez);
	fclose(f);
	return 0;
}