Luogu P3941 入阵曲【前缀和】By cellur925
题目大意:给你一个\(n\)*\(m\)的矩阵,每个位置都有一个数,求有多少不同的子矩阵使得矩阵内所有数的和是\(k\)的倍数。
数据范围给的非常友好233,期望得到的暴力分:75分。前12个点可以用\(O(n^4)\)算法水过,对于\(<=400\)的有特殊性质2的数据,我们还可以尝试苟一下,开始用了一个什么鬼方法(?),其实我们只要枚举所有可能的矩形面积判断一下是否满足条件再加上这种矩形面积的所有可能数就行啦。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m,k;
ll ans,mapp[450][450];
ll gcd(ll a,ll b)
{
return b ? gcd(b,a % b) : a ;
}
void calc(ll a,ll lima,ll b,ll limb)
{
ll cnt1=lima-a+1;
ll cnt2=limb-b+1;
ans+=cnt1*cnt2;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lld",&mapp[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
mapp[i][j]+=mapp[i-1][j]+mapp[i][j-1]-mapp[i-1][j-1];
if(n<=80||m<=2)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int l=1;l<=n&&i-l+1>=1;l++)
for(int r=1;r<=m&&j-r+1>=1;r++)
{
int ii=i-l+1,jj=j-r+1;
ll sum=mapp[i][j]+mapp[ii-1][jj-1]-mapp[ii-1][j]-mapp[i][jj-1];
if(sum%k==0) ans++;
}
printf("%lld\n",ans);
return 0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if((i*j*mapp[1][1])%k==0) calc(i,n,j,m);
printf("%lld\n",ans);
return 0;
}
其实做这道题的时候感觉和昨天考试T1比较像的,我们可以很容易的想出\(O(n^4)\)算法,再根据一些性质(如单调性)优化到\(O(n^3)\)。本题要求的复杂度同样是\(O(n^3)\)。
由“\(k\)的倍数”我们可以想到另一道题:ZR某次普及膜底赛当时chengni dalao给我讲了子共七的思想,虽说后来讲了子共七那道原题,还是没A==。
我们考虑在一维序列上的情况,若\(sum[i]\)模\(k\)等于\(A\),之后出现了一个\(sum[j]\)模\(k\)也等于\(A\),那么显然有\([i+1,j]\)这部分的和是\(k\)的倍数(模\(k\)为\(0\))。
我们可以推广到矩阵上的情况,像昨天一样枚举矩阵的上下界,再枚举一个左右边界,统计余数个数,这样能把复杂度压到\(O(n^3)\)。每次的计数数组要清空,但是用\(memset\)会超时,不妨用数组记录一下空间换时间。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int n,m,moder;
ll ans,f[1000][1000],tong[1000090],b[1000090];
int main()
{
scanf("%d%d%d",&n,&m,&moder);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lld",&f[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
(f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+moder)%=moder;
for(int i=0;i<n;i++)//注意是从0开始枚举
for(int j=i+1;j<=n;j++)
{
tong[0]=1;
for(int k=1;k<=m;k++)
{
b[k]=(f[j][k]-f[i][k]+moder)%moder;
ans+=tong[b[k]]++;
}
for(int k=1;k<=m;k++) tong[b[k]]=0;
}
printf("%lld\n",ans);
return 0;
}
矩阵+前缀和思路:
发现题目中的单调性
当问“倍数”时,考虑取膜,与前缀和结合计数
另外敲敲说一句 看到入阵曲/星空/将军令这三首歌题的时候激动了一下==!
Luogu P3941 入阵曲【前缀和】By cellur925的更多相关文章
- [luogu]P3941 入阵曲[前缀和][压行]
[luogu]P3941 入阵曲 题目描述 小 F 很喜欢数学,但是到了高中以后数学总是考不好. 有一天,他在数学课上发起了呆:他想起了过去的一年.一年前,当他初识算法竞赛的 时候,觉得整个世界都焕然 ...
- luogu P3941 入阵曲
嘟嘟嘟 这道题我觉得跟最大子矩阵那道题非常像,都是O(n4)二维前缀和暴力很好想,O(n3)正解需要点转化. O(n4)暴力就不说啦,二维前缀和,枚举所有矩形,应该能得55分. O(n3)需要用到降维 ...
- 【思维】Luogu P3941 入阵曲
题目大意 洛谷链接 给出一个矩阵和 \(K\) ,问有多少子矩阵中的元素和能整除 \(K\). 数据范围 \(2\leq n,m\leq 400\),\(0\leq K\leq 10^6\). 思路 ...
- [洛谷P3941]:入阵曲(前缀和+桶)
题目传送门 题目背景 丹青千秋酿,一醉解愁肠.无悔少年枉,只愿壮志狂. 题目描述 小$F$很喜欢数学,但是到了高中以后数学总是考不好.有一天,他在数学课上发起了呆:他想起了过去的一年.一年前,当他初识 ...
- 洛谷P3941入阵曲
题目传送门 这道题也是今年湖南集训队Day8的第一题,昨天洛谷的公开赛上又考了一遍,来发个记录(其实是因为五月天,另外两道题分别是将军令和星空,出这次题目的人肯定同为五迷(✪㉨✪)) 话不多说.先理解 ...
- P3941 入阵曲
\(\color{#0066ff}{ 题目描述 }\) 小 F 很喜欢数学,但是到了高中以后数学总是考不好. 有一天,他在数学课上发起了呆:他想起了过去的一年.一年前,当他初识算法竞赛的 时候,觉得整 ...
- 落谷P3941 入阵曲
题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 题目描述 小 F 很喜欢数学,但是到 ...
- [洛谷P3941] 入阵曲
题目背景 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 入阵曲 题解在代码里. #include<iostream> #include<cstdio> #include& ...
- 题解 P3941 入阵曲
题解 观察数据范围,可以 \(\mathcal O(n^2m^2)\) 暴力计算,而加上特殊性质,则可以骗到 \(75pts\) 正解: 我们发现,在一维情况下,\(\mod k\) 相同的前缀和相减 ...
随机推荐
- 《机器学习实战》学习笔记第三章 —— 决策树之ID3、C4.5算法
主要内容: 一.决策树模型 二.信息与熵 三.信息增益与ID3算法 四.信息增益比与C4.5算法 五.决策树的剪枝 一.决策树模型 1.所谓决策树,就是根据实例的特征对实例进行划分的树形结构.其中有两 ...
- Html+CSS3技术实现动画、天气图标动态效果 效果很酷
1. [代码][CSS]代码 <svg version="1.1" id="sun" class="climacon c ...
- 清除float浮动三种方式
Float的作用? w3c的官方解释: Content flows down the right side of a left-floated box and down the left side o ...
- 使用mutt+msmtp做linux邮件客户端
下载MSMTP wget http://nchc.dl.sourceforge.net/sourceforge/msmtp/msmtp-1.4.17.tar.bz2 tar xvf msmtp-1 ...
- 每天一个linux命令(3):cd命令
版权声明 更新:2017-04-27博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下命令cd. 2 开 ...
- vue实现图片的上传和删除
目录 1 UI库使用ElementUI 2 后端使用Express + formidable模块 1 UI库使用ElementUI 安装ElementUI $ npm install --save-d ...
- 《c# 实现p2p文件分享与传输系统》 一、 模型
c#实现P2P文件分享与传输系统 一.模型 P2P的概念大家都不陌生,也就是所谓的“点对点传输”,即不直接通过服务器,在两台或多台客户端之间传输数据,实现信息交流和资源共享.P2P技术已经发展了很多年 ...
- 搭建基于Nagios的监控系统——之监控远程Linux服务器
上一篇介绍了如何安装Nagios Core,这一篇跟大家分享一下如何将一台远程的Linux服务器加入纳入监控范围. 第一部分:在远程Linux上安装Nagios Plugins和NRPE 第一步: ...
- AI-Info-Micron-Insight:在线购物算法的核心是强大的 DRAM
ylbtech-AI-Info-Micron-Insight:在线购物算法的核心是强大的 DRAM 1.返回顶部 1. 在线购物算法的核心是强大的 DRAM 网购已成为标准程序.你滚动浏览各种服装页面 ...
- 教程:动手用自己电脑搭建一个网站 (nat123 花生壳 动态域名 个人电脑做服务器)
先ps一下..今晚试了N种方法,终于找到一个靠谱 免费 好用的方法,来改装自己电脑成为服务器,在外网也能通过域名访问了!!! 需要准备的东西: Tomcat:这个是web容器,其实有了这个就已经让电脑 ...