Cod sursa(job #460095)

Utilizator indestructiblecont de teste indestructible Data 1 iunie 2010 11:16:40
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>
#include <string.h>
#define NMAX 71
#define LMAX 131
#define HMAX 100005
#define ll long long
int n,A[NMAX][NMAX][NMAX];
int divs[LMAX];
ll rez,C[LMAX];
struct triplet
{
	int a,b,c;
};
triplet B[HMAX];
void read()
{
	scanf("%d",&n);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d%d%d",&B[i].a,&B[i].b,&B[i].c);
}
void clear_data()
{
	memset(A,0,sizeof(A));
	/*int i,j,k;
	for (i=0; i<NMAX; i++)
		for (j=0; j<NMAX; j++)
			for (k=0; k<NMAX; k++)
				A[i][j][k]=0;*/
}
void prepare()
{
	int i,j,k,t,a,b,c;
	for (i=2; i<LMAX; i++)
	{
		clear_data();
		for (j=1; j<=n; j++)
			A[B[j].a%i][B[j].b%i][B[j].c%i]++;
		for (j=0; j<NMAX && j<i; j++)
			for (k=0; k<NMAX && j<i; k++)
				for (t=0; t<NMAX && t<i; t++)
				{
					a=(i-j)%i; b=(i-k)%i; c=(i-t)%i;
					if (j==a && k==b && t==c)
						C[i]+=(ll)A[j][k][t]*(A[j][k][t]-1)/2;
					else
						C[i]+=(ll)A[j][k][t]*A[a][b][c]/2;
				}
	}
}
void prepare2()
{
	int i,j;
	for (i=2; i<LMAX; i++)
		if (!divs[i])
		{
			for (j=i*i; j<LMAX; j+=i*i)
				divs[j]=-1;
			for (j=i; j<LMAX; j+=i)
				if (divs[j]>=0)
					divs[j]++;
		}
	for (i=2; i<LMAX; i++)
		if (divs[i] & 1)
			rez+=C[i];
		else
			rez-=C[i];
}
int main()
{
	freopen("puteri.in","r",stdin);
	freopen("puteri.out","w",stdout);
	read();
	prepare();
	prepare2();
	printf("%lld\n",rez);
	return 0;
}