Typesetting math: 100%

洛谷P3941 入阵曲

题目链接

入阵曲

solution

  • 很容易想到预处理二维前缀和%k的余数,然后O(n4)判断
  • 考虑如何优化到O(n3)
  • 我们可以枚举子矩形的起点的x坐标与水平长度,于是问题就可转化为一维
  • 在一维平面上,一个子矩阵的和可以转化为一个大的前缀矩阵和减去一个小的,显然只要这2个矩阵和%k的余数相同,对应的子矩阵就符合条件
  • 于是可以O(n)扫一遍记录%k余i的前缀矩阵和有多少个,即可O(n3)完成

code

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
#include<bits/stdc++.h> using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();} return x*f; } typedef long long ll; const int N=450; const int K=1e6+10; int n,m,k,a[N][N],s[N][N],w[K]; ll ans; inline int add(int x,int y){return (x+y>=k)?x+y-k:x+y;} inline int dec(int x,int y){return (x-y<0)?x-y+k:x-y;} int main(){ // freopen("rally.in","r",stdin); // freopen("rally.out","w",stdout); n=read();m=read();k=read(); for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j) s[i][j]=read(),s[i][j]%=k; } for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j) s[i][j]=dec(add(s[i][j-1],add(s[i-1][j],s[i][j])),s[i-1][j-1]); } for(int i=0;i<=m;++i){ for(int j=i+1;j<=m;++j){ for(int ww=0;ww<=n;++ww){ int nw=dec(s[ww][j],s[ww][i]); ans+=w[nw]; ++w[nw]; } for(int ww=0;ww<=n;++ww){ int nw=dec(s[ww][j],s[ww][i]); --w[nw]; } } } printf("%lld",ans); return 0; }
posted @   cjTQX  阅读(69)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开