Cod sursa(job #496794)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 30 octombrie 2010 17:56:53
Problema Puteri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <cstdio>
#define nmax 100010

int n, a[nmax], b[nmax], c[nmax], v[66][66][66], g[66];
long long sol;

int main()
{
	freopen("puteri.in","r",stdin);
	freopen("puteri.out","w",stdout);
	scanf("%d",&n);
	int i, k, ck, t, f, d, x, y, z;
	long long s;
	for (i=1; i<=n; i++) 
		scanf("%d %d %d",&a[i],&b[i],&c[i]);
	for (k=2; k<=128; k++)
	{
		ck=k;
		t=0;
		for (d=2; d*d<=k; d++)
		{
			f=0;
			while (!(ck%d))
			{
				f++;
				ck/=d;
			}
			if (f>1) 
			{
				t=-1;
				break;
			} else 
				if (f==1) t++;
		}
		if (ck>1 && t>-1) t++;
		if (t>-1)
		{
			s=0;
			for (x=0; x<=64; x++)
				for (y=0; y<=64; y++)
					for (z=0; z<=64; z++) v[x][y][z]=0;
			for (i=1; i<=64; i++) g[i]=i%k;
			for (i=1; i<=n; i++)
			{
				x=(k-g[a[i]]);
				if (x==k) x=0;
				y=(k-g[b[i]]);
				if (y==k) y=0;
				z=(k-g[c[i]]);
				if (z==k) z=0;
				if (x<=64 && y<=64 && z<=64)
					s+=v[x][y][z];
				x=g[a[i]];
				y=g[b[i]];
				z=g[c[i]];
				v[x][y][z]++;
			}
			if (t%2) sol+=s; else sol-=s;
		}
	}
	printf("%lld\n",sol);
}