Cod sursa(job #45667)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 1 aprilie 2007 19:48:31
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<fstream>
using namespace std;


int z[32],t;
int a[32]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,91,97,101,103,107,109,113,127};
int b[32][129][129][129],i,j,k,u,v,w;
long N,X,r,Y[32];

fstream fin,fout;

void sub(int z[32],int k,int p)
{
if (p<128)
	{
	if ((k-1)%2==1)
		X=X+Y[p];
		else X=X-Y[p];
	for (int i=z[k-1]+1;i<32;i++)
		{
		z[k]=i;
		sub(z,k+1,p*a[i]);
		}
	}
}

int main(void)
{
fin.open("puteri.in",ios::in);
fout.open("puteri.out",ios::out);

for (i=0;i<=128;i++)
	for (j=0;j<=128;j++)
		for (k=0;k<=128;k++)
			for (u=0;u<32;u++)
				b[u][i][j][k]=0;
			
fin>>N;
for (i=1;i<=N;i++)
	{
	fin>>u>>v>>w;
	for (j=0;j<32;j++)
		{
		t=a[j];
		b[j][u%t][v%t][w%t]++;
		}
	}
for (j=0;j<32;j++)
	{
	Y[j]=0;
	t=a[j];
	for (u=0;u<t;u++)
		for (v=0;v<t;v++)
			for (w=0;w<t;w++)
				if ((t==u+u)&&(t==v+v)&&(t==w+w))
					Y[j]=Y[j]+b[j][u][v][w]*(b[j][u][v][w]-1)/2;
				  else	Y[j]=Y[j]+b[j][u][v][w]*b[j][t-u][t-v][t-w];
	}
				
X=0;
z[0]=0;
sub(z,1,1);
fout<<X<<endl;
fin.close();
fout.close();
return 0;
}