Cod sursa(job #677635)
#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<<1][maxval<<1][maxval<<1],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;
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;
}