Typesetting math: 100%
题目链接
入阵曲
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(){
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 @
2020-10-18 20:23
cjTQX
阅读(
69)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战