[SCOI2006] 数字立方体
题目类型:三维前缀和+同余方程
传送门:>Here<
题意:给出一个立方体,求有多少个子立方体的和为\(k\)的倍数
解题思路
暴力做法:\(O(n^6)\)枚举子立方体
考虑只枚举长和宽,为了简化问题,我们可以将问题表示成:
给定一个矩阵,求有多少个子矩阵的和为\(M\)的倍数
我们可以不必枚举宽,仅仅用\(O(n^2)\)枚举长,然后对于给定的行数,维护一个前缀和\(s[i]\)。于是一个子矩阵的和就可以表示为\(s[r]-s[l-1]\)。考虑一下何时这个子矩阵是\(M\)的倍数?用同余方程描述,就是$$s[r]-s[l-1]≡0 \ (mod \ M)$$也就是$$s[l-1]≡s[r] \ (mod \ M)$$于是我们只需要维护一个桶表示目前为止\(s[r]==i\)的个数就可以了
推广到立方体,改一下前缀和的计算公式就可以了
\(s[i][j][k] = s[i-1][j][k] + s[i][j-1][k] - s[i-1][j-1][k] + s[i][j][k-1] - s[i-1][j][k-1] - s[i][j-1][k-1] + s[i-1][j-1][k-1] + a[i][j][k]\)
反思
注意这道题问的是\(M\)的倍数,有关和,而且涉及倍数——一个前缀和,一个数论,就都可以解决了。
Code
注意循环变量的初始值。由于如果每次把桶清零非常耗时,一个优化是只清当前这轮涉及到的。当前这轮最多涉及到\(N\)个,因此非常快。
/*By DennyQi 2018*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 10010;
const int MAXM = 20010;
const int INF = 1061109567;
inline int Max(const int a, const int b){ return (a > b) ? a : b; }
inline int Min(const int a, const int b){ return (a < b) ? a : b; }
inline int read(){
int x = 0; int w = 1; register char c = getchar();
for(; c ^ '-' && (c < '0' || c > '9'); c = getchar());
if(c == '-') w = -1, c = getchar();
for(; c >= '0' && c <= '9'; c = getchar()) x = (x<<3) + (x<<1) + c - '0'; return x * w;
}
ll Ans;
int N,M,K;
int a[45][45][45],s[45][45][45],sum[45],cnt[1000010];
int main(){
// freopen(".in","r",stdin);
N = read(), M = read();
for(int i = 1; i <= N; ++i){
for(int j = 1; j <= N; ++j){
for(int k = 1; k <= N; ++k){
a[i][j][k] = read();
s[i][j][k] = ((s[i-1][j][k] + s[i][j-1][k] - s[i-1][j-1][k] + s[i][j][k-1] - s[i-1][j][k-1] - s[i][j-1][k-1] + s[i-1][j-1][k-1] + a[i][j][k]) % M + M) % M;
}
}
}
for(int i = 1; i <= N; ++i){
for(int j = i; j <= N; ++j){
for(int p = 1; p <= N; ++p){
for(int q = p; q <= N; ++q){
cnt[0] = 1;
for(int k = 1; k <= N; ++k){
sum[k] = ((s[j][q][k]-s[i-1][q][k]-s[j][p-1][k]+s[i-1][p-1][k]) % M + M) % M;
Ans += 1ll * cnt[sum[k]];
cnt[sum[k]]++;
}
for(int k = 1; k <= N; ++k) cnt[sum[k]] = 0;
}
}
}
}
printf("%lld", Ans);
return 0;
}
[SCOI2006] 数字立方体的更多相关文章
- Project Euler 90:Cube digit pairs 立方体数字对
Cube digit pairs Each of the six faces on a cube has a different digit (0 to 9) written on it; the s ...
- 《Python核心编程》 第五章 数字 - 课后习题
课后习题 5-1 整形. 讲讲 Python 普通整型和长整型的区别. 答:普通整型是绝大多数现代系统都能识别的. Python的长整型类型能表达的数值仅仅与你机器支持的(虚拟)内存大小有关. 5- ...
- 基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
基于css3新属性transform,实现3d立方体的旋转 通过原生JS,点击事件,鼠标按下.鼠标抬起和鼠标移动事件,实现3d立方体的拖动旋转,并将旋转角度实时的反应至界面上显示 实现原理:通过获取鼠 ...
- BZOJ 1261: [SCOI2006]zh_tree( 区间dp )
dp(l, r)表示[l, r]这段作为一棵树的最小访问代价. 对于dp(l, r), 我们枚举它的根x, 则dp(l, r) = min(dp(l, x-1)+dp(x+1, r)+C*fx) + ...
- HTML5 CSS3 诱人的实例: 3D立方体旋转动画
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/34120047 创意来自:http://www.html5tricks.com/d ...
- CSS3之3D立方体效果
下面代码可实现3D立方体,比较好理解,就是让每个面先平移到指定位置,然后旋转90度 <!DOCTYPE html> <html lang="en"> < ...
- bzoj千题计划184:bzoj1261: [SCOI2006]zh_tree
http://www.lydsy.com/JudgeOnline/problem.php?id=1261 dp[l][r][dep] 区间[l,r]内的节点,根在dep层的最小代价 枚举根i,dp[ ...
- 数字图像处理笔记与体会(一)——matlab编程基础
最近开始学习数字图像处理,使用matlab实现,下面我就来记录笔记和体会,一方面是给大家提供参考,另一方面是防止我忘记了. 复习一下: 1.数字图像是用一个数字矩阵来表示的,数字阵列中的每个数字,表示 ...
- 仿智能社官网:原生JS实现简单又酷炫的3D立方体时钟
先放一下我做的效果:https://linrunzheng.github.io/3Dclock/3Dclock/new.html 至于3D立方体怎么做这里就不在阐述了,可以看一下我之前的博客. 这里默 ...
随机推荐
- jupyter notebook安装、登录
pip install jupyter 提示pip需要升级(本人装的是anaconda) 输入:python -m pip install --upgrade pip 安装完成. 运行jupyter ...
- 从零学习Fluter(五):Flutter中手势滑动拖动已经网络请求
从六号开始搞Flutter,到今天写这篇blog已经过了4天时间,文档初步浏览了一遍,写下了这个demo.demo源码分享在github上,现在对flutter有种说不出的喜欢了.大家一起搞吧! 废话 ...
- android中的websocket 应用
websocket 在实际的应用中不仅仅能做聊天应用,还可以利用websocket长连接保持数据的实时更新以及信息的推送. websocket 的实现的关键点 第一个:首先需要引入 java-webs ...
- Docker 镜像编排并部署SpringBoot应用
Docker-compose是一个基于Docker的编排工具,所谓编排个人理解就是将不同的镜像通过配置,组成一个新的运行环境,官方定义是:Compose is a tool for defining ...
- spring学习总结——装配Bean学习三(xml装配bean)
通过XML装配bean Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了.不过,鉴于已经存在那么多基于XML的Spring配置,所以理解如何在Spring中使用 ...
- 推荐一款关于MongoDB日志分析的工具--Mtools
一. 需求背景 MongoDB数据库的强大的文档模型使其成为处理数据的最佳方式.文档适用于广泛的流行数据模型,支持各种各样的场景.文档模型可以包含键值.关系数据集和图形数据集,当然,还可以包含父子关系 ...
- 20180831-Linux环境下Python 3.6.6 的安装说明
20180831-Linux环境下Python 3.6.6 的安装说明 摘要:Python3 安装部署,普通用户,编译安装 Author: andy_yhm@yeah.net Date: 201808 ...
- Allowed memory size of 134217728 bytes exhausted解决办法(php内存耗尽报错)【简记】
报错: PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) i ...
- Saltstack_使用指南07_远程执行-执行模块
1. 主机规划 远程执行教程文档 https://docs.saltstack.com/en/latest/topics/tutorials/modules.html 所有模块文档 https://d ...
- LeetCode算法题-Quad Tree Intersection(Java实现)
这是悦乐书的第260次更新,第273篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第127题(顺位题号是558).四叉树是树数据,其中每个内部节点恰好有四个子节点:top ...