Cod sursa(job #27063)
#include <stdio.h>
#define MAXN (1 << 17)
typedef long long llong;
typedef unsigned char byte;
int N, R[66][66][66], nrd, prim[128], D[128], sgn[128];
byte A[MAXN], B[MAXN], C[MAXN];
byte rest[66][128];
llong res;
void preproc(void)
{
int i, j, k, T = 0;
for(i = 1; i <= 64; i++)
for(j = 1; j < 128; j++)
rest[i][j] = i%j;
for(prim[++T] = 2, i = 3; i <= 128; i+=2)
{
for(j = 3; j < i; j++)
if(i%j == 0)
break ;
if(j == i)
prim[++T] = i;
}
for(i = 1; i <= T; i++)
D[++nrd] = prim[i], sgn[nrd] = 1;
for(i = 1; i <= T; i++)
for(j = i+1; j <= T; j++)
if(prim[i]*prim[j] <= 128)
D[++nrd] = prim[i]*prim[j], sgn[nrd] = -1;
for(i = 1; i <= T; i++)
for(j = i+1; j <= T; j++)
for(k = j+1; k <= T; k++)
if(prim[i]*prim[j]*prim[k] <= 128)
D[++nrd] = prim[i]*prim[j]*prim[k], sgn[nrd] = 1;
}
void baga(int ind)
{
int i, j, k, r1, r2, r3, t, d, semn;
d = D[ind], semn = sgn[ind];
for(i = 1; i <= N; i++)
{
r1 = d-rest[A[i]][d], r2 = d-rest[B[i]][d];
r3 = d-rest[C[i]][d];
if(r1 == d) r1 = 0;
if(r2 == d) r2 = 0;
if(r3 == d) r3 = 0;
if(r1 > 64 || r2 > 64 || r3 > 64)
continue ;
t = R[r1][r2][r3];
if(semn == 1)
res += (llong)t;
else
res -= (llong)t;
R[ rest[A[i]][d] ][ rest[B[i]][d] ][ rest[C[i]][d] ]++;
}
for(i = 1; i <= N; i++)
R[ rest[A[i]][d] ][ rest[B[i]][d] ][ rest[C[i]][d] ] = 0;
}
int main(void)
{
freopen("puteri.in", "rt", stdin);
freopen("puteri.out", "wt", stdout);
int i;
scanf("%d\n", &N);
for(i = 1; i <= N; i++)
scanf("%d %d %d\n", &A[i], &B[i], &C[i]);
preproc();
for(i = 1; i <= nrd; i++)
baga(i);
printf("%lld\n", res);
return 0;
}