[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立方体怎么做这里就不在阐述了,可以看一下我之前的博客. 这里默 ...
随机推荐
- Building QGIS from source - step by step(随笔3)
依赖包安装 在编译QGIS前分别需要利用cygwin和OSGeo4W 安装网站上的依赖库.分别需要安装的依赖库可以参考官网,此外对应版本的ygwin和OSGeo4W 也可以在网站上找到下载链接. ht ...
- C#监控指定目录的文件变化的代码
如下的资料是关于C#监控指定目录的文件变化的代码. FileSystemWatcher watcher = new FileSystemWatcher();watcher.Path = @" ...
- Android 简单实现控件的拖动
控件的拖动,使用到一个监听事件 setOnTouchListener:XML代码: <?xml version="1.0" encoding="utf-8" ...
- IPD体系向敏捷开发模式转型实施成功的四个关键因素
文/杨学明 集成产品开发(IPD).集成能力成熟度模型(CMMI).敏捷开发(Agile Development)是当前国内外企业产品研发管理的最常用的3种模式.随着创新环境的快速发展,许多企业都会 ...
- js 条件判断
练习 小明身高1.75,体重80.5kg.请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: 低于18.5:过轻 18.5-25:正常 25-28:过重 28-32:肥 ...
- 推荐一款关于MongoDB日志分析的工具--Mtools
一. 需求背景 MongoDB数据库的强大的文档模型使其成为处理数据的最佳方式.文档适用于广泛的流行数据模型,支持各种各样的场景.文档模型可以包含键值.关系数据集和图形数据集,当然,还可以包含父子关系 ...
- 实现MongoDB读写分离的“读偏好”介绍
在某些情况下,将读请求发送给副本集的备份节点是合理的,例如,单个服务器无法处理应用的读压力,就可以把查询请求路由到可复制集中的多台服务器上.现在绝大部分MongoDB驱动支持读偏好设置(read pr ...
- MVC Controller return 格式分类及用法
概述 所看到的Action都是return View();我们可以看作这个返回值用于解析一个aspx文件.而它的返回类型是ActionResult如 public ActionResult Index ...
- sed 查找文件的某一行内容
1,查找文件text中第三行的内容 命令: sed -n '3p' text 2,查找文件text中第二行到第四行的内容 命令: sed -n '2,4p' text
- iOS开发者学习Flutter
Flutter for iOS 开发者 本文档适用那些希望将现有 iOS 经验应用于 Flutter 的开发者.如果你拥有 iOS 开发基础,那么你可以使用这篇文档开始学习 Flutter 的开发. ...