0pts
#include<cstdio>
#include<algorithm>
#include<cmath>
long long ans,n,m,a[2006][2006],chfen[2006][2006];
struct array{
long double a[2006];
friend bool operator <(array x,array y)
{
for(int i=1;i<=2000;i++)
if(fabs(x.a[i]-y.a[i])>1e-7) return x.a[i]<y.a[i]+1e-7;
}
friend bool operator ==(array x,array y)
{
for(int i=1;i<=2000;i++)
if(fabs(x.a[i]-y.a[i])>1e-7) return 0;
return 1;
}
}diver[2006];
int rounder(long double x)
{
return int(x+0.5);
}
bool nointeger(array x)
{
for(int i=1;i<=2000;i++)
if(fabs(x.a[i]-rounder(x.a[i]))>1e-7) return 1;
return 0;
}
void read(long long &x)
{
char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
}
void print(long long x)
{
if(x==0) putchar('0');
int stk[20],top=0;
while(x) stk[++top]=x%10,x/=10;
for(int i=top;i>=1;i--) putchar(stk[i]+'0');
}
int main()
{
read(m),read(n);
if(n<=2) print(m*(m+1)/2);
else
{
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
read(a[i][j]);
if(j>=2) chfen[i][j-1]=a[i][j-1]-a[i][j];
if(j>=3) diver[i].a[j-2]=chfen[i][j-1]/(chfen[i][j-2]*1.0L);
}
int top=m;
for(int i=1;i<=m;i++)
if(nointeger(diver[i])) std::swap(diver[i],diver[top]),top--;
std::sort(diver+1,diver+top+1);
int k=0;
for(int i=1;i<=top+1;i++)
if((diver[i]==diver[i-1]||i==1)&&i!=top+1) k++;
else
{
ans+=k*(k-1)/2;
k=1;
}
print(ans);
}
return 0;
}