Cod sursa(job #421230)

Utilizator mihai995mihai995 mihai995 Data 21 martie 2010 12:33:31
Problema Copii Scor 0
Compilator cpp Status done
Runda Algoritmiada 2010, Runda 4, Clasele 5-8 Marime 1.17 kb
#include <fstream>
using namespace std;
short int v[1<<4][1<<4],q[1<<4];
int n,k=1<<4;
long long cou;

void check(int x)
{
	bool y[1<<4][1<<4];
	int i,j,nr=0;
	for (i=1;i<=x;i++)
		for (j=1;j<=x;j++)
			y[i][j]=false;
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
			if (v[i][j] && q[i]!=q[j])
				y[q[i]][q[j]]=true;
	for (i=1;i<=x;i++)
		for (j=1;j<=x;j++)
			nr+=y[i][j];
	if (nr==x*(x-1))
		cou++;
}

long long pow(long long n,int x)
{
	if (x==1)
		return n;
	return pow(n,x%2)*pow(n*n,x/2);
}

void teams(int p,int x)
{
	if (p==n+1)
	{
		check(x);
		return;
	}
	for (int i=1;i<=x;i++)
	{
		q[p]=i;
		teams(p+1,x);
	}
}	

int main()
{
	int i,j;
	char s[10];
	long long rezultat=0;
	ifstream in("copii.in");
	ofstream out("copii.out");
	in>>n;
	in.get();
	for (i=1;i<=n;i++)
	{
		in.getline(s,n+1);
		for (j=1;j<=n;j++)
		{
			v[i][j]=s[j-1]-'0';
			v[i][0]+=v[i][j];
		}
		if (v[i][0]<k)
			k=v[i][0];
	}
	k++;
	if (n==2 && k==1)
	{
		out<<"1";
		return 0;
	}
	if (k==n)
	{
		cou=n;
		out<<pow(cou,n);
		return 0;
	}
	for (i=2;i<=n;i++)
	{
		teams(1,i);
		rezultat+=cou/i;
		cou=0;
	}
	out<<rezultat;
	return 0;
}