using namespace std;
#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>
#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair
#define IN "puteri.in"
#define OUT "puteri.out"
#define N_MAX 1<<17
#define MOD 65535
typedef vector<int> VI;
typedef pair<int,int> pi;
typedef vector<string> VS;
int mod,N,P[1<<7];
int V[N_MAX];
II void ciur()
{
P[++P[0]] = 2;
vector<bool> viz(1<<8,false);
for(int i=3;i<(1<<7);i+=2)
{
if(viz[i])
continue;
P[++P[0]] = i;
for(int j=i+i;j<(1<<7);j+=i)
viz[j] = true;
}
}
II void scan()
{
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d",&N);
int a,b,c;
FOR(i,1,N)
{
scanf("%d %d %d",&a,&b,&c);
V[i] = a * 10000 + b * 100 + c;
}
}
II void make(int &a,int &b,int &c,int x)
{
c = x % 100;
b = (x / 100) % 100;
a = (x / 10000);
a = a % mod;
b = b % mod;
c = c % mod;
}
vector< vector<int> > H(MOD+4);
II int count(int x)
{
int rest = x & MOD;
int cat = x / MOD;
int l = (int)H[rest].sz()-1;
int count(0);
FOR(j,0,l)
if(H[rest][j] == cat)
++count;
return count;
}
II void insert(int x)
{
H[x & MOD].pb(x / MOD);
}
II void solve()
{
int a,b,c;
ll rez(0);
FOR(pi,1,P[0])
{
mod = P[pi];
for(int i=N-1;i>=1;--i)
{
make(a,b,c,V[i-1]);
if(V[i-1])
insert(a*10000+b*100+c);
make(a,b,c,V[i]);
rez += count( (a?mod-a:0) * 10000 + (b?mod-b:0) * 100 + (c?mod-c:0) );
}
FOR(i,0,MOD)
H.resize(0);
}
printf("%lld\n",rez);
}
int main()
{
ciur();
scan();
solve();
return 0;
}