#include <stdio.h>
#include <string.h>
#define FOR(i,a,b) for (int (i) = (a); i < (int)(b); i++)
long long NR;
int nr[65][65][65];
int nrp[65][65][65];
int prim[130];
int isprime( int k )
{
if (k == 2)
return 1;
if (k % 2 == 0)
return 0;
int i;
for (i = 3; i * i <= k; i += 2)
if (k % i == 0)
return 0;
return 1;
}
inline int min( int a, int b )
{
return (a < b) ? a : b;
}
int st[130];
void back( int k, int K, int P, int type )
{
if (P > 128)
return;
if (k == K)
{
memset(nrp, 0, sizeof(nrp));
FOR(a,0,65) FOR(b,0,65) FOR(c,0,65)
nrp[a % P][b % P][c % P] += nr[a][b][c];
long long NR2 = 0;
FOR(a, 0, min(65, P) ) FOR(b, 0, min(65, P) ) FOR(c, 0, min(65, P) )
{
int a2, b2, c2;
a2 = (P - a) % P; b2 = (P - b) % P; c2 = (P - c) % P;
if (a2 > 64 || b2 > 64 || c2 > 64)
continue;
NR += type * (long long)nrp[a][b][c] * (nrp[a2][b2][c2] - (a2 == a && b2 == b && c2 == c));
NR2 += (long long)nrp[a][b][c] * (nrp[a2][b2][c2] - (a2 == a && b2 == b && c2 == c));
}
return;
}
int i = 1;
if (k > 0) i = st[k - 1] + 1;
for (; i <= prim[0]; i++)
st[k] = i,
back( k + 1, K, P * prim[i], type);
}
int main()
{
freopen("puteri.in", "rt", stdin);
freopen("puteri.out", "wt", stdout);
int N;
scanf("%d", &N);
FOR(i,0,N)
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
nr[a][b][c]++;
}
FOR(i,2,130)
if (isprime( i ))
prim[++prim[0]] = i;
int P = 1;
FOR(i,1,prim[0] + 1)
{
P *= prim[i];
if (P > 128)
break;
if (i & 1)
back(0, i, 1, 1);
else
back(0, i, 1, -1);
}
printf("%lld\n", NR >> 1);
return 0;
}