码农
https://www.luogu.com.cn/problem/P2363
#include<bits/stdc++.h>
using namespace std;
int a[2100][2100],dp[2280][2280],f[10111000];
void read(int &x) {
char ch; bool ok;
for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
int main()
{
int n,ans=0;
memset(f,0,sizeof(f));
read(n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
read(a[i][j]);dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+a[i][j];
}
for(int ki=1;ki<=n;ki++)
for(int kj=1;kj<=n;kj++)
{
for(int i=1;i<=ki;i++)
for(int j=1;j<=kj;j++)
f[dp[ki][kj]-dp[ki][j-1]-dp[i-1][kj]+dp[i-1][j-1]]++;
for(int i=ki+1;i<=n;i++)
for(int j=kj+1;j<=n;j++)
ans+=f[dp[i][j]-dp[i][kj]-dp[ki][j]+dp[ki][kj]];
for(int i=1;i<=ki;i++)
for(int j=1;j<=kj;j++)
f[dp[ki][kj]-dp[ki][j-1]-dp[i-1][kj]+dp[i-1][j-1]]=0;
for(int i=1;i<=ki;i++)
for(int j=kj+1;j<=n;j++)
f[dp[ki][j]-dp[ki][kj]-dp[i-1][j]+dp[i-1][kj]]++;
for(int i=ki+1;i<=n;i++)
for(int j=1;j<=kj;j++)
ans+=f[dp[i][kj]-dp[i][j-1]-dp[ki][kj]+dp[ki][j-1]];
for(int i=1;i<=ki;i++)
for(int j=kj+1;j<=n;j++)
f[dp[ki][j]-dp[ki][kj]-dp[i-1][j]+dp[i-1][kj]]=0;
}
cout<<ans;
return 0;
}```