Cod sursa(job #213058)

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