Cod sursa(job #41605)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 28 martie 2007 13:40:15
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
# include <stdio.h>
# include <string.h>

# define  _fin  "puteri.in"
# define  _fout "puteri.out"

# define  maxn  100002
# define  maxp  130
# define  maxr  65


int p[maxn][3], nr[maxr][maxr][maxr], ad[maxr][maxr][maxr], n;
int a[maxp], i, j, sol, to;

int A, B, C, mA, mB, mC;

int mod[128][128];

void readf()
{
	freopen(_fin, "r", stdin);
	for (scanf("%d", &n), i=1; i<=n; i++) scanf("%d%d%d", &p[i][0], &p[i][1], &p[i][2]);
}

int ndiv(int x)
{
	int d, cnt, ret=0;
	for (d=2; x!=1; d++) {
		for (cnt=0; !(x%d); ++cnt, x/=d);
		ret += (cnt==1);
	}
	return ret;
}

void solve()
{
	for (i=2; i<=128; i++)
		for (j=0; j<128; j++) mod[j][i] = j%i;
	
	for (i=2; i<=128; i++) {
		memset(nr, 0, sizeof(nr));
		memset(ad, 0, sizeof(ad));
		
		to = i>maxr?maxr:i;
		
		for (j=1; j<=n; j++) ++nr[ mod[p[j][0]][i] ][ mod[p[j][1]][i] ][ mod[p[j][2]][i] ];
		
		for (A=mA=0; A<to; A++, mA=mod[i-A][i] )
			for (B=mB=0; B<to; B++, mB=mod[i-B][i] )
				for (C=mC=0; C<to; C++, mC=mod[i-C][i] )
					if ( mA<maxr&&mB<maxr&&mC<maxr )
					if ( !ad[A][B][C] ) {
						if ( A==mA && B==mB && C==mC )
							a[i] += ((nr[A][B][C]*(nr[A][B][C]-1))>>1), ad[A][B][C]=1;
						else
							a[i] += nr[A][B][C]*nr[mA][mB][mC], ad[A][B][C]=ad[mA][mB][mC]=1;
					}
		
		if ( ndiv(i)&1 ) sol+=a[i];
		else sol -= a[i];
	}
}

int main()
{
	readf();
	solve();
	
	fprintf(fopen(_fout,"w"), "%d\n", sol);
	
	return 0;
}