Cod sursa(job #677526)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 10 februarie 2012 12:21:05
Problema Puteri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<stdio.h>
#include<cstring>

#define maxn 100005
#define maxval 70

FILE*f=fopen("puteri.in","r");
FILE*g=fopen("puteri.out","w");

int n,i,j,val;
int a[maxn][3],Nr[maxval][maxval][maxval],needed[3][3];
int x[4];
long long nrsol;

void back ( int niv ){
	if ( niv == 4 ){
		nrsol += Nr[x[1]][x[2]][x[3]];
		return ;
	}
	
	for ( int i = 1 ; i <= needed[niv-1][0] ; ++i ){
		x[niv] = needed[niv-1][i];
		back(niv+1);
	}
}

inline int max ( int a , int b ){
	return a >= b ? a : b;
}

int main () {
	
	fscanf(f,"%d",&n);
	
	int val_max = 0;
	for ( i = 1 ; i <= n ; ++i ){
		fscanf(f,"%d %d %d",&a[i][0],&a[i][1],&a[i][2]);
		for ( j = 0 ; j < 3 ; ++j ){
			val_max = max(val_max,a[i][j]);
		}
	}
	
	for ( i = 1 ; i <= n ; ++i ){
		
		for ( val = max(a[i][0],max(a[i][1],a[i][2])) ; val <= (val_max<<1) ; ++val ){
			memset(needed,0,sizeof(needed));
			int ok = 1;
			for ( j = 0 ; j < 3 ; ++j ){
				needed[j][0] = 1;
				needed[j][1] = val - a[i][j];
				if ( needed[j][1] > val_max ){
					ok = 0;
					break ;
				}
				if ( needed[j][1] && !a[i][j] )
					++needed[j][0],needed[j][2] = 0;
			}
			if ( ok )
				back(1);
		}
		
		++Nr[a[i][0]][a[i][1]][a[i][2]];
	}
	
	fprintf(g,"%lld\n",nrsol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}