Cod sursa(job #209440)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 22 septembrie 2008 16:08:13
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<stdio.h>
#define P 128
#define N 250000
long long n,i,x[N],y[N],z[N],v[N],adr[N],s[P],j,k,op[P],sol,na,v1,mask,asol;
void readd(),solve(),semne();
int comb(int nr);
int main()
{       readd();
	solve();
	return 0;
}
void readd()
{
	freopen("puteri.in","r",stdin);
	freopen("puteri.out","w",stdout);
	scanf("%lld",&n);
	for(i=1;i<=n;i++)scanf("%lld%lld%lld",&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()
{       long long k2,ax,ay,az,bx,by,bz,a,b;
	semne();
	mask=1;mask<<=17;mask--;
	for(k=2;k<=127;k++)
	{ if(!s[k])continue;
	  for(i=1;i<k;i++)op[i]=k-i;
	  k2=k*k;asol=0;na=0;
	  for(i=1;i<=n;i++)
	  { ax=x[i]%k;ay=y[i]%k;az=z[i]%k;
	    bx=op[ax];by=op[ay];bz=op[az];
	    a=k2*ax+k*ay+az;
	    b=k2*bx+k*by+bz;
	    if(a<b)
	    { if(!v[a])adr[++na]=a;
	      v[a]+=8;v[a]|=3;
	    }
	    else
	    if(a>b)
	    { if(!v[b])adr[++na]=b;
	      v[b]+=(1<<20);v[b]|=5;
	    }
	    else
	    { if(!v[a])adr[++na]=a;
	      v[a]+=2;
	    }
	  }
	  for(i=1;i<=na;i++)
	  { a=adr[i];
	    if(v[a]&7==7)
	    { v[a]>>=3;
	      v1=v[a]&mask;
	      v[a]>>=17;
	      asol+=v[a]*v1;
	    }
	    else
	    if(!(v[a]&1))
	    { v[a]>>=1;
	      asol+=(v[a]*(v[a]-1))/2;
	    }
	    v[a]=0;
	  }
	  sol+=s[k]*asol;
	}
	printf("%lld\n",sol);
}