Cod sursa(job #214800)

Utilizator stinkyStinky si Grasa stinky Data 15 octombrie 2008 23:13:35
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<stdio.h>
#include<string.h>
#define N 100010
#define MAX 130

struct triplet
{
	int x,y,z;
};
int n;
triplet v[N];

int mod[MAX][MAX],nrd[MAX];
long long a[MAX][MAX][MAX];

void citire()
{
	scanf("%d",&n);
	for(int i=0 ; i<n ; ++i)
		scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].z);
}

void init_mod()
{
	for(int i=0;i<MAX;++i)
		for(int j=1;j<MAX;++j)
			mod[i][j]=i%j;
}

void init_d()
{
	for(int i=2;i<MAX;++i)
		if(nrd[i]==0)
			for(int j=i;j<MAX;j+=i)
				++nrd[j];
	for(int i=2;i<MAX;++i)
		if(nrd[i]==1)
		{
			int k=i*i;
			for(int j=k;j<MAX;j+=k)
				nrd[j]=0;
		}
}

inline long long comb(long long n)
{
	return n*(n-1);
}

void init_a(int p)
{
	memset(a,0,sizeof(a));
	for(int i=0;i<n;++i)
		++a[mod[v[i].x][p]][mod[v[i].y][p]][mod[v[i].z][p]];
}

long long calcul_p(int p)
{
	long long s=0;
	for(int i=0;i<p;++i)
		for(int j=0;j<p;++j)
			for(int k=0;k<p;++k)
				if(i==mod[p-i][p] && j==mod[p-j][p] && k==mod[p-k][p])
					s+=comb(a[i][j][k]);
				else
					s+=a[i][j][k]*a[mod[p-i][p]][mod[p-j][p]][mod[p-k][p]];
	if(nrd[p]&1)
		return s>>1;
	return -(s>>1);
}

long long calcul()
{
	long long sol=0;
	for(int i=2;i<MAX;++i)
		if(nrd[i])
		{
			init_a(i);
			sol+=calcul_p(i);
		}
	return sol;
}

int main()
{
	freopen("puteri.in","r",stdin);
	freopen("puteri.out","w",stdout);
	init_mod();
	init_d();
	citire();
	printf("%lld\n",calcul());
	return 0;
}