Cod sursa(job #466172)

Utilizator SheepBOYFelix Liviu SheepBOY Data 26 iunie 2010 11:48:24
Problema Colorare3 Scor 90
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.13 kb
#include<stdio.h>
#include<stdlib.h>
#define MOD 1000000007
struct Corzi{
int cap,coada;
};

int n,k,nop[100003];
Corzi GRF[100003];

void OpenGate()
{
	freopen("colorare3.in","r",stdin);
	freopen("colorare3.out","w",stdout);
}

void ReadInput()
{
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;++i)
		scanf("%d%d",&GRF[i].cap,&GRF[i].coada);	
}

int PaintIt()
{
	int cnx,lst,i,j,posib=1;
	for(i=0;i<n;++i)
	{
		cnx=0;
		lst=GRF[i].cap;
		
		while(GRF[i].cap==lst&&i<n)
		{
			nop[GRF[i].coada];
			
			posib=((long long)posib*((k-(nop[GRF[i].coada]+nop[lst]))%MOD))%MOD;
			
			++nop[GRF[i].coada];
			++nop[lst];
		
			++cnx;
			++i;
		}
		
		
		if(cnx)
			if(i<n)
				--i;
	}
	return posib;
}

int CMP(const void *a,const void *b)
{
	Corzi x,y;
	x=*(Corzi *)a;
	y=*(Corzi *)b;
	
	if(x.cap<y.cap)
		return -1;
	
	if(x.cap>y.cap)
		return 1;
	
	if(x.cap==y.cap)
	{
		if(x.coada<y.coada)
			return -1;
	
		if(x.coada>y.coada)
			return 1;

		return 0;
	}
	
}

int main()
{
	OpenGate();
	ReadInput();
	--n;
	qsort(GRF,n,sizeof(GRF[0]),CMP);
	printf("%d",PaintIt());
	return 0;
}