分析:其实很容易想到O(n^3m^3)的算法,枚举x1,x2,y1,y2,再统计一下和.求和可以用前缀和,能优化到O(n^2m^2),能得到60分.对于特殊性质的点,求一下a[i][j]与k的最小公倍数lcm,就可以推出来要选多少个点,乘法原理推一下就能解决了.

满分做法的思想是降维,先分析一下一维怎么做.问题要求满足(a[l] + a[l + 1] + ...... + a[r]) % k = 0的区间[l,r]有多少个.利用前缀和优化就是(sum[r] - sum[l - 1]) % k = 0.对约束进行变形:sum[r] % k = sum[l - 1] % k. O(n)的扫一遍,记录当前的sum[i] % k,看前面有多少个和它相同的就可以了.

转化到二维上,为了用上一维的做法,固定矩形的上边界和下边界,把每一列看做是一个元素a[i],就可以用上一维的做法了,是一个非常常见的变形.

求子矩阵问题的常用思路是先转化到1维上进行处理,再把行或列压一下,就能把2维放到1维上处理了,数学式子一定要会变形!

75分暴力:

#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll; ll n, m, k, a[][], sum[][], t, ans;
bool flag = true; void solve2()
{
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
for (int p = i; p <= n; p++)
for (int q = j; q <= m; q++)
{
ll temp = sum[p][q] - sum[i - ][q] - sum[p][j - ] + sum[i - ][j - ];
if (temp % k == )
ans++;
}
printf("%lld\n", ans);
} ll gcd(ll a, ll b)
{
if (!b)
return a;
return gcd(b, a % b);
} void solve1()
{
ll lcm = a[][] / gcd(a[][], k) * k;
ll res = lcm / a[][];
ll temp = ;
while (res <= n * m)
{
temp = ;
for (ll i = ; i <= n; i++)
if (res % i == && (res / i) <= m)
temp += (n - i + ) * (m - res / i + );
//printf("%lld %lld\n", res, temp);
ans += temp;
res += lcm / a[][];
}
printf("%lld\n", ans);
} int main()
{
scanf("%lld%lld%lld", &n, &m, &k);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
scanf("%lld", &a[i][j]);
if (!(i == && j == ) && a[i][j] != t)
flag = false;
t = a[i][j];
sum[i][j] = sum[i - ][j] + sum[i][j - ] - sum[i - ][j - ] + a[i][j];
}
if (flag)
solve1();
else
solve2(); return ;
}

正解:

#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll; ll n, m, k, a[][], sum[][], ans, cnt[]; int main()
{
scanf("%lld%lld%lld", &n, &m, &k);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
scanf("%lld", &a[i][j]);
sum[i][j] = sum[i - ][j] + sum[i][j - ] - sum[i - ][j - ] + a[i][j];
}
for (int i = ; i < n; i++)
for (int j = i + ; j <= n; j++)
{
cnt[] = ;
for (int kk = ; kk <= m; kk++)
{
ll p = (sum[j][kk] - sum[i][kk] + k) % k;
ans += cnt[p];
cnt[p]++;
}
for (int kk = ; kk <= m; kk++)
cnt[(sum[j][kk] - sum[i][kk] + k) % k] = ;
}
printf("%lld\n", ans); return ;
}

noip模拟赛 入阵曲的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. 题解报告:hdu 1166 敌兵布阵(线段树or树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头 ...

  2. dubbo服务端响应超时错误一例记录

    错误描述: Portlet J2AppsPortlet::QuickStartPortlet not available: Waiting server-side response timeout. ...

  3. 1-最全CSS3选择器

    一,CSS3 选择器分类 二,选择器语法 1,基本选择器语法 选择器 类型 功能描述 *  通配选择器  选择文档中所以HTML元素 E  元素选择器 选择指定类型的HTML元素 #id  ID选择器 ...

  4. 设置UITableViewCell 选中时的背景颜色

    自定义Cell如图 一个View上面放了四个Label 分别连线到.m文件中 @property (weak, nonatomic) IBOutlet UILabel *nameLabel; @pro ...

  5. ambari-server启动报错500 status code received on GET method for API:/api/v1/stacks/HDP/versions/2.4/recommendations Error message : Server Error解决办法(图文详解)

    问题详情 来源是,我在Ambari集群里,安装Hue. 给Ambari集群里安装可视化分析利器工具Hue步骤(图文详解 所遇到的这个问题. 然后,去ambari-server的log日志,查看,如下 ...

  6. Quartz~关于cron表达式要说的

    每20秒执行一次

  7. ssm基础配置

    1.导包 <dependencies> <dependency> <groupId>org.springframework</groupId> < ...

  8. C/S模型:TCP,UDP构建客户端和服务器端(BIO实现

    Java中提供了socket编程来构建客户端和服务器端 TCP构建服务器端的步骤:(1)bind:绑定端口号(2)listen:监听客户端的连接请求(3)accept:返回和客户端连接的实例(4)re ...

  9. cesium 原理 之 command拼接

    VAO VAO(Vertext Array Object),中文是顶点数组对象.之前在<Buffer>一文中,我们介绍了Cesium如何创建VBO的过程,而VAO可以简单的认为是基于VBO ...

  10. 火狐删除配置文件 会删除目录下所有文件 切记不要把配置文件建立在桌面 恢复软件:易我数据恢复向导 9.0 DiskGenius500

    火狐删除配置文件 会删除目录下所有文件 切记不要把配置文件建立在桌面 恢复软件:易我数据恢复向导 9.0  DiskGenius500 结果:由于时间比较常 恢复文件均失败了~