Cod sursa(job #214480)

Utilizator swift90Ionut Bogdanescu swift90 Data 14 octombrie 2008 19:45:06
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#include<string.h>
struct{
	int x,y,z;
}nr[100100];
int diviz[130],N,so;
int a[130][130][130];
void divizor(){
	int i,j,n=129;
	for(i=2;i<n;++i){
		if(!diviz[i])
			for(j=i;j<n;j+=i){
				++diviz[j];
				if(j%(i*i)==0)
					diviz[j]=-100000;
			}
	}
}
void calc(int p){
	int i;
	for(i=0;i<N;++i)
		++a[nr[i].x%p][nr[i].y%p][nr[i].z%p];
}
int proces(int p){
	int i,j,k,sol=0;
	for(i=0;i<=p/2;++i){
		for(j=0;j<=p;++j){
			for(k=0;k<=p;++k){
				if(i==(p-i)%p && j==(p-j)%p && k==(p-k)%p)
					sol+=(a[i][j][k]*(a[i][j][k]-1))/2;
				else
					sol+=a[i][j][k]*a[(p-i)%p][(p-j)%p][(p-k)%p];
			}
		}
	}
	return sol;
}
int main(){
	freopen("puteri.in","r",stdin);
	freopen("puteri.out","w",stdout);
	int i;
	scanf("%d",&N);
	for(i=0;i<N;++i)
		scanf("%d%d%d",&nr[i].x,&nr[i].y,&nr[i].z);
	divizor();
	for(i=2;i<=128;++i){
		if(diviz[i]>=0){
			memset(a,0,sizeof(a));
			calc(i);
			if(diviz[i]%2)
				so+=proces(i);
			else
				so-=proces(i);
		}
	}
	
	printf("%d\n",so);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}