Codeforces 364A - Matrix
原题地址:http://codeforces.com/problemset/problem/364/A
题目大意:
给定一个数字a(0 ≤ a ≤ 109)和一个数列s(每个数都是一位,长度不超过4000),定义一个矩阵Mij = si * sj ,求M有多少个子矩阵上面的数字和恰巧等于a
算法分析:
这道题是Codeforces Round #213 Div 1 Problem A && Div 2 Problem C,赛场上没写对,主要是没分析清楚,有一点想法就迫不及待地提交,结果白白提交了九次。后来以为自己想通了一个小BUG,转天又开始毛毛躁躁……看了数据才发现自己脑残忘了一种情况……教训十分沉重。
首先我们定义一个子矩阵为(x, y, z, t),意思为以矩阵中的点(x, y)为左上角,(z, t)为右下角的子矩形。我们需要通过观察发现对于某个子矩形上的元素和,恰巧等于
\( \sum\limits_{i=x}^{z} s_{i} * \sum\limits_{i=y}^{t} s_{i}\) (这一点很容易证明)。接下来我们要做的就是预处理出来一个部分和\( sum[i] = \sum\limits_{x=1}^{i} s_{x} \),
然后我们就可以用\( n^2 \)的时间求出s上任意一段的部分和。设w[t]为t在所有的部分和中出现的次数(亦即:枚举i和j(i ≤ j),若i到j的部分和为t,++w[t])
那么,我们要求的就是对于a的每个因子q,\( \sum\limits_{q | a} w[q] * w[a / q] \)。
至于接下来……就是几个需要注意的我脑残的地方了
- s的最大长度为4000,每一位的最大值是9,所以w最大只需要到36000,保险起见开到40000。
- 尽管任何一段的部分和都不会超过36000,但是w[a/q]很可能使数组越界,需要特判
- 如果a=0,需要进行特殊处理
//date 20131119
#include <cstdio>
#include <string>
#include <iostream>
#include <cstring> using namespace std; const int maxn = ;
const int maxa = ; long long a, ans;
string s;
int sum[maxn];
int w1[maxa]; int main()
{
//freopen("matrix.in", "r", stdin);
//freopen("matrix.out", "w", stdout);
cin >> a;
ans = ; //if(a == 0L){printf("0\n"); return 0;} cin >> s;
int l = s.length();
for(int i = ; i <= l; ++i) sum[i] = s[i - ] - '';
for(int i = ; i <= l; ++i)
sum[i] = sum[i - ] + sum[i]; for(int i = ; i <= l; ++i)
for(int j = ; j <= i; ++j)
w1[sum[i] - sum[j - ]]++; if(a > )
for(int i = ; i < maxa; ++i)
{
if(a % (long long)i == )
{
if((a / (long long)i) >= maxa)continue;
ans += (long long)w1[i] * (long long)w1[a / (long long)i];
}
} else{
for(int i = ; i < maxa; ++i)
ans += (long long)w1[] * (long long)w1[i];
ans *= 2L; ans += (long long)w1[] * (long long)w1[];
}
cout << ans << endl;
return ;
}
继续加油!
Codeforces 364A - Matrix的更多相关文章
- 【Codeforces 364A】Matrix
[链接] 我是链接,点我呀:) [题意] 让你求出b[i][j]=s[i]*s[j]规则构成的矩阵 的所有子矩阵中子矩阵的和为a的子矩阵的个数 [题解] (x,y,z,t) 会发现它的和就是sum(x ...
- Codeforces 954C Matrix Walk (思维)
题目链接:Matrix Walk 题意:设有一个N×M的矩阵,矩阵每个格子都有从1-n×m的一个特定的数,具体数的排列如图所示.假设一个人每次只能在这个矩阵上的四个方向移动一格(上下左右),给出一条移 ...
- [codeforces gym Matrix God]随机矩阵乘法
题目链接:http://codeforces.com/gym/101341/problem/I 随机真是一个神奇的方法.原本矩阵乘法是n^3的复杂度,但是这个题是让判断两个矩阵是否相等,只需要在两个矩 ...
- codeforces #364a Cards
cf的a题没什么好说到,100的量级,每个人给2张牌,使每个人手中的牌点数相等.保证有一种分配方案. 对每个人,先计算出手中的牌的点数,然后循环两遍拿牌就可以. A. Cards time lim ...
- CodeForces 313C Ilya and Matrix
Ilya and Matrix Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Su ...
- Codeforces Round #277 (Div. 2) B. OR in Matrix 贪心
B. OR in Matrix Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/486/probl ...
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) C. Little Artem and Matrix 模拟
C. Little Artem and Matrix 题目连接: http://www.codeforces.com/contest/669/problem/C Description Little ...
- Codeforces Round #540 (Div. 3) C. Palindromic Matrix 【暴力】
任意门:http://codeforces.com/contest/1118/problem/C C. Palindromic Matrix time limit per test 2 seconds ...
- Educational Codeforces Round 9 F. Magic Matrix 最小生成树
F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...
随机推荐
- 多线程的单元测试工具 - GroboUtils
写过Junit单元测试的同学应该会有感觉,Junit本身是不支持普通的多线程测试的,这是因为Junit的底层实现上,是用System.exit退出用例执行的.JVM都终止了,在测试线程启动的其他线程自 ...
- (转载)SQLServer存储过程返回值总结
1. 存储过程没有返回值的情况(即存储过程语句中没有return之类的语句) 用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况 (1)假如通过查询 ...
- NGUI系列教程八(监听NGUI的事件方法)
NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定在按钮上,当按钮点击时就可以监听到,这种方法不太好很不 ...
- XSS前端防火墙
前一段时间,在EtherDream大神的博客里看到关于XSS防火墙的一系列文章,觉得很有意思.刚好科创要做一个防火墙,就把XSS前端防火墙作为一个创新点,着手去实现了. 在实现过程中,由于各种原因,比 ...
- Tomcat 搭配 Nginx 还是 Apache 呢?
Apache .Tomcat.Nginx的区别, 哪个与Tomcat搭配效率高? 一. 定义: 1. Apache Apache HTTP服务器是一个模块化的服务器,可以运行在几乎所有广泛使用的计算机 ...
- HTMLParser获取属性名
HTMLParser获取属性名方式: 原始网页文本: <a title="美军被曝虐尸" href="http://www.sogou.com/web?query= ...
- Qt库的静态编译
一.准备软件1. MinGW (C:\Qt\MinGW)http://pan.baidu.com/share/link?shareid=174269&uk=673227135这个文件解 ...
- ExtJs 自定义Vtype验证
最近公司开发项目在用ExtJs,碰到验证的就大概的总结了一些常用的验证.自定义的验证主要有两种方式:一种是单字段的自定义验证,另一种是多字段间的验证.对于单字段的验证主要通过regex配置项指定自定义 ...
- 1055: [HAOI2008]玩具取名 - BZOJ
Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使 ...
- 3140:[HNOI2013]消毒 - BZOJ
题目描述 Description 最近在生物实验室工作的小 T 遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,a.b.c均为正整数.为了实验的方便,它被划 ...