Cod sursa(job #677640)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 10 februarie 2012 14:24:33
Problema Puteri Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 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,conf;
int a[maxn][3],ciur[maxval<<1],nr[maxval][maxval][maxval],r[3];

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 ){
			if ( a[i][j] > val_max )
				val_max = a[i][j];
		}
	}
	
	val_max = val_max << 1;
	for ( i = 2 ; i <= val_max ; ++i ){
		if ( !ciur[i] ){
			ciur[i] = 1;
			for ( j = i + i ; j <= val_max ; j += i ){
				if ( ciur[j] != -1 )
					++ciur[j];
				if ( !(j % (i*i)) )
					ciur[j] = -1;
			}
		}
	}
	
	long long sol = 0;
	for ( conf = 2 ; conf <= val_max ; ++conf ){
		if ( ciur[conf] == -1 )
			continue ;
		
		long long nrper = 0;
		for ( i = 1 ; i <= n ; ++i ){
			for ( j = 0 ; j < 3 ; ++j ){
				r[j] = a[i][j] % conf;
			}
			int v1 = r[0] ? conf - r[0] : 0;
			int v2 = r[1] ? conf - r[1] : 0;
			int v3 = r[2] ? conf - r[2] : 0;
			if ( v1 < 65 && v2 < 65 && v3 < 65 )
				nrper += nr[v1][v2][v3];
			++nr[r[0]][r[1]][r[2]];
		}
		
		for ( i = 1 ; i <= n ; ++i ){
			for ( j = 0 ; j < 3 ; ++j ){
				r[j] = a[i][j] % conf;
			}
			--nr[r[0]][r[1]][r[2]];
		}
		
		if ( ciur[conf] & 1 )
			sol += nrper;
		else
			sol -= nrper;
	}
	
	fprintf(g,"%lld\n",sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}