Cod sursa(job #209418)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 22 septembrie 2008 11:53:27
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include<stdio.h>
#define P 12//8
#define N 100//002
int n,i,x[N],y[N],z[N],s[P],j,k,a[P][P][P],op[P],sol;
void readd(),solve(),semne(),solve0(),solve1(),solve2();
int comb(int nr);
int main()
{       readd();
	solve();
	return 0;
}
void readd()
{
	freopen("puteri.in","r",stdin);
	freopen("puteri.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d%d%d",&x[i],&y[i],&z[i]);
}
void semne()
{
 s[2]=1;s[3]=1;s[5]=1;s[6]=-1;s[7]=1;s[10]=-1;s[11]=1;s[13]=1;s[14]=-1;
 s[15]=-1;s[17]=1;s[19]=1;s[21]=-1;s[22]=-1;s[23]=1;s[26]=-1;s[29]=1;
 s[30]=1;s[31]=-1;s[33]=-1;s[34]=-1;s[35]=-1;s[37]=1;s[38]=-1;s[39]=-1;
 s[41]=1;s[42]=1;s[43]=1;s[46]=-1;s[47]=1;s[51]=-1;s[53]=1;s[55]=-1;
 s[57]=-1;s[58]=-1;s[59]=1;s[61]=1;s[62]=-1;s[65]=-1;s[66]=1;s[67]=1;
 s[69]=-1;s[70]=1;s[71]=1;s[73]=1;s[74]=-1;s[77]=-1;s[78]=1;s[79]=1;
 s[82]=-1;s[83]=1;s[85]=-1;s[86]=-1;s[87]=-1;s[89]=1;s[91]=-1;s[93]=-1;
 s[94]=-1;s[95]=-1;s[97]=1;s[101]=1;s[102]=1;s[103]=1;s[105]=1;
 s[106]=-1;s[107]=1;s[109]=1;s[110]=1;s[111]=-1;s[113]=1;s[114]=1;s[115]=-1;
 s[118]=-1;s[119]=-1;s[122]=-1;s[123]=-1;s[127]=-1;

}
void solve()
{    semne();
     solve2();
     solve0();
     solve1();
     printf("%d",sol);
}
void solve2()
{       long r1,r2,r3;
	for(i=1;i<=n;i++)
	 a[x[i]%2][y[i]%2][z[i]%2]++;
	for(r1=0;r1<2;r1++)
	 for(r2=0;r2<2;r2++)
	  for(r3=0;r3<2;r3++)
	  { sol+=comb(a[r1][r2][r3]);
	    a[r1][r2][r3]=0;
	  }
}
void solve0()
{       int b1,val,r1,r2,r3,q1,q2,q3;
	for(k=6;k<127;k+=2)
	{ if(!s[k])continue;
	  for(i=1;i<=n;i++)
	   a[x[i]%k][y[i]%k][z[i]%k]++;
	  b1=k/2;
	  val=0;
	  val+=comb(a[0][0][0]);a[0][0][0]=0;
	  val+=comb(a[0][0][b1]);a[0][0][b1]=0;
	  val+=comb(a[0][b1][0]);a[0][b1][0]=0;
	  val+=comb(a[0][b1][b1]);a[0][b1][b1]=0;
	  val+=comb(a[b1][0][0]);a[b1][0][0]=0;
	  val+=comb(a[b1][0][b1]);a[b1][0][b1]=0;
	  val+=comb(a[b1][b1][0]);a[b1][b1][0]=0;
	  val+=comb(a[b1][b1][b1]);a[b1][b1][b1]=0;
	  for(i=1;i<k;i++)op[i]=k-i;
	  for(r1=0;r1<k;r1++)
	   for(r2=0;r2<k;r2++)
	    for(r3=0;r3<k;r3++)
	     { q1=op[r1];q2=op[r2];q3=op[r3];
	       val+=a[r1][r2][r3]*a[q1][q2][q3];
	       a[r1][r2][r3]=0;
	     }
	  val*=s[k];
	  sol+=val;
	}
}
void solve1()
{       int val,r1,r2,r3,q1,q2,q3;
	for(k=3;k<=127;k+=2)
	{ if(!s[k])continue;
	  for(i=1;i<=n;i++)
	   a[x[i]%k][y[i]%k][z[i]%k]++;
	  val=0;
	  val+=comb(a[0][0][0]);a[0][0][0]=0;
	  for(i=1;i<k;i++)op[i]=k-i;
	  for(r1=0;r1<k;r1++)
	   for(r2=0;r2<k;r2++)
	    for(r3=0;r3<k;r3++)
	     { q1=op[r1];q2=op[r2];q3=op[r3];
	       val+=a[r1][r2][r3]*a[q1][q2][q3];
	       a[r1][r2][r3]=0;
	     }
	  val*=s[k];
	  sol+=val;
	}
}
int comb(int nr)
{
	return nr*(nr-1)/2;
}