#include<bits/stdc++.h>
#define in inline
#define int long long
using namespace std;
const int N=2010,M1=1e9+7,M2=1e9+9;
int f1[N],f2[N],ha[N][N],hb[N][N],hc[N][N];
int n,m,ans,tans,a[N][N],b[N][N],c[N][N];
in int read()
{
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;c=getchar();
}
while('0'<=c&&c<='9')
x=x*10+c-'0',c=getchar();
return x*f;
}
in int check(int x,int y,int len)
{
if(x>n||y>m||x<len||y<len)return 0;
int tmp=x;
int r1=ha[x][y]-ha[x][y-len]*f1[len]-ha[x-len][y]*f2[len]+ha[x-len][y-len]*f1[len]*f2[len];
x=m-(x-len);
int r2=hb[x][y]-hb[x][y-len]*f1[len]-hb[x-len][y]*f2[len]+hb[x-len][y-len]*f1[len]*f2[len];
x=tmp,y=n-(y-len);
int r3=hc[x][y]-hc[x][y-len]*f1[len]-hc[x-len][y]*f2[len]+hc[x-len][y-len]*f1[len]*f2[len];
return r1==r2&&r2==r3;
}
signed main()
{
int i,j,l,r,mid;
n=read(),m=read();
for(i=1;i<=n;++i)
for(j=1;j<=m;++j){
a[i][j]=read();
b[n-i+1][j]=a[i][j];
c[i][m-j+1]=a[i][j];
}
f1[0]=f2[0]=1;
for(i=1;i<=max(n,m);++i)
f1[i]=f1[i-1]*M1,f2[i]=f2[i-1]*M2;
for(i=1;i<=n;++i){
for(j=1;j<=m;++j){
ha[i][j]=ha[i][j-1]*M1+a[i][j];
hb[i][j]=hb[i][j-1]*M1+b[i][j];
hc[i][j]=hc[i][j-1]*M1+c[i][j];
}
}
for(i=1;i<=n;++i)
for(j=1;j<=m;++j){
ha[i][j]+=ha[i-1][j]*M2;
hb[i][j]+=hb[i-1][j]*M2;
hc[i][j]+=hc[i-1][j]*M2;
}
for(i=1;i<=n;++i)
for(j=1;j<=m;++j){
ans=0,l=1,r=min(min(i,j),min(n-i+1,m-j+1));
while(l<=r){
mid=(l+r)>>1;
if(check(i+mid-1,j+mid-1,mid*2-1))
ans=mid,l=mid+1;
else r=mid-1;
}
tans+=ans,ans=0;
l=1,r=min(min(i,j),min(n-i,m-j));
while(l<=r){
mid=(l+r)>>1;
if(check(i+mid,j+mid,mid*2))
ans=mid,l=mid+1;
else r=mid-1;
}
tans+=ans;
}
cout<<tans;
}