原题地址: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] \)。

至于接下来……就是几个需要注意的我脑残的地方了

  1. s的最大长度为4000,每一位的最大值是9,所以w最大只需要到36000,保险起见开到40000。
  2. 尽管任何一段的部分和都不会超过36000,但是w[a/q]很可能使数组越界,需要特判
  3. 如果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的更多相关文章

  1. 【Codeforces 364A】Matrix

    [链接] 我是链接,点我呀:) [题意] 让你求出b[i][j]=s[i]*s[j]规则构成的矩阵 的所有子矩阵中子矩阵的和为a的子矩阵的个数 [题解] (x,y,z,t) 会发现它的和就是sum(x ...

  2. Codeforces 954C Matrix Walk (思维)

    题目链接:Matrix Walk 题意:设有一个N×M的矩阵,矩阵每个格子都有从1-n×m的一个特定的数,具体数的排列如图所示.假设一个人每次只能在这个矩阵上的四个方向移动一格(上下左右),给出一条移 ...

  3. [codeforces gym Matrix God]随机矩阵乘法

    题目链接:http://codeforces.com/gym/101341/problem/I 随机真是一个神奇的方法.原本矩阵乘法是n^3的复杂度,但是这个题是让判断两个矩阵是否相等,只需要在两个矩 ...

  4. codeforces #364a Cards

    cf的a题没什么好说到,100的量级,每个人给2张牌,使每个人手中的牌点数相等.保证有一种分配方案. 对每个人,先计算出手中的牌的点数,然后循环两遍拿牌就可以.   A. Cards time lim ...

  5. CodeForces 313C Ilya and Matrix

    Ilya and Matrix Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Su ...

  6. 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 ...

  7. 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 ...

  8. Codeforces Round #540 (Div. 3) C. Palindromic Matrix 【暴力】

    任意门:http://codeforces.com/contest/1118/problem/C C. Palindromic Matrix time limit per test 2 seconds ...

  9. Educational Codeforces Round 9 F. Magic Matrix 最小生成树

    F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...

随机推荐

  1. ACE_linux:Reactor与Proactor两种模式的区别

    一.概念: Reactor与Proactor两种模式的区别.这里我们只关注read操作,因为write操作也是差不多的.下面是Reactor的做法: 某个事件处理器宣称它对某个socket上的读事件很 ...

  2. android 软件开机自启动

    安卓的很多功能实现方式都是“Don't call me, I'll call you back!”,开机启动就是其中之一 步骤: 1.首先建立一个BroadcastReceiver, 2.在他的onR ...

  3. CorelDRAW 文件实用工具 CDRTools 2

    随着 CorelDRAW 更新脚步越来越频繁,版本之间兼容性问题越来越突出,特别是跨版本之间打开会有很多问题,比如:文字跑位.透镜变向.位图出错.颜色改变,甚至会造成文件损坏.最好的办法就是哪一个版本 ...

  4. Kinetic使用注意点--ellipse

    new Ellipse(config) 参数: config:包含所有配置项的对象. { radius: "半径,可以用数字a.数组[a,b]或对象{x:a,y:b}来表示" } ...

  5. Maven使用本地jar包(小私服?支持自动打入war包)

    1.库目录结构 D:\maven-local-repo\cn\xcf007\MD5\1.0\MD5-1.0.jar 2.安装到该本地库 mvn install:install-file -Dfile= ...

  6. resin access.log format配置详解

    The access log formatting variables follow the Apache variables:     %b result content length %D tim ...

  7. 回顾Ado.Net

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Da ...

  8. C# - Generic

    定义泛型类 创建泛型类,在类定义中包含尖括号语法 class MyGenericClass<T> { ... } T可以是任意标识符,只要遵循通常的C#命名规则即可.泛型类可以在其定义中包 ...

  9. 实验五 Java网络编程及安全

    北京电子科技学院 实      验      报      告 课程:移动平台应用开发实践  班级:201592   姓名:曾俊宏  学号:20159210 成绩:___________  指导老师: ...

  10. VS2008的默认打开重置为VS2008