Cod sursa(job #215184)

Utilizator swift90Ionut Bogdanescu swift90 Data 17 octombrie 2008 18:43:46
Problema Puteri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<stdio.h>
#include<string.h>
struct mmmmm{
	int x,y,z;
}nr[100100];
int diviz[130],N,so;
int a[130][130][130],mod[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[mod[nr[i].x][p]][mod[nr[i].y][p]][mod[nr[i].z][p]];
}
int proces(int p){
	int i,j,k,sol=0;
	for(i=0;i<p;++i){
		for(j=0;j<p;++j){
			for(k=0;k<p;++k){
				if(i==mod[p-i][p] && j==mod[p-j][p] && k==mod[p-k][p])
					sol+=(a[i][j][k]*(a[i][j][k]-1));
				else
					sol+=a[i][j][k]*a[mod[p-i][p]][mod[p-j][p]][mod[p-k][p]];
			}
		}
	}
	return sol/2;
}
void modulo(){
	int i,j;
	for(i=1;i<130;++i){
		for(j=1;j<130;++j)
			mod[i][j]=i%j;
	}
}
void citire(){
	int i,j,x;
	char aux[50];
	fgets(aux,50,stdin);
	for(i=0;i<N;++i){
		fgets(aux,50,stdin);
		x=0;
		for(j=0;'0'<=aux[j] && aux[j]<='9';++j)
			x=x*10+aux[j]-'0';
		nr[i].x=x;
		x=0;
		++j;
		for(;'0'<=aux[j] && aux[j]<='9';++j)
			x=x*10+aux[j]-'0';
		nr[i].y=x;
		x=0;
		++j;
		for(;'0'<=aux[j] && aux[j]<='9';++j)
			x=x*10+aux[j]-'0';
		nr[i].z=x;
	}
}
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);*/
	citire();
	divizor();
	modulo();
	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;
}