N^4 60分暴力
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
ll n,m,K,s[405][405],ans;
int main()
{
scanf("%lld%lld%lld",&n,&m,&K);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%lld",&s[i][j]);
s[i][j]+=s[i][j-1]+s[i-1][j]-s[i-1][j-1];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=i;k<=n;k++)
for(int l=j;l<=m;l++)
if((s[k][l]-s[i-1][l]-s[k][j-1]+s[i-1][j-1])%K==0) ans++;
printf("%lld\n",ans);
}
正解:
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
ll n,m,K,s[405][405],ans,sd[405],r[1000000+5];
int main()
{
scanf("%lld%lld%lld",&n,&m,&K);
for(int i=1;i<=n;i++)//行
for(int j=1;j<=m;j++)//列
{
scanf("%lld",&s[i][j]);
s[i][j]=(s[i][j]+s[i][j-1]+(K<<1))%K;
}
for(int i=1;i<=m;i++)
for(int j=i;j<=m;j++)
{
for(int k=1;k<=n;k++)
{
sd[k]=(sd[k-1]+s[k][j]-s[k][i-1]+(K<<1))%K;
r[sd[k]]=0;
}
for(int k=1;k<=n;k++)
{
if(!sd[k]) ans++;
ans+=r[sd[k]];//*******
r[sd[k]]++;//********
}
}
printf("%lld\n",ans);
}