【洛谷 P3941】入阵曲

来源:互联网 发布:nginx允许ip访问 编辑:程序博客网 时间:2024/06/07 13:50

N^4 60分暴力

#include<cstdio>#include<iostream>#include<cstring>#define ll long longusing 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 longusing 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);}
原创粉丝点击