Codeforces 365C - Matrix(hash + yy)
2013-11-20 21:04
288 查看
题意:给定你一个数串s,再给你一个 a ,问你在矩阵d(第i,j个元素为si*sj)有多少个小矩形的和为a
解题思路:可知 a = (s[x] + s[x+1] + ....s[y])* (s[p]+s[p+1]+....s[q]); 我们只需要枚举各字串的和以及其个数就可以得到所求小矩形的个数
解题代码:
View Code
解题思路:可知 a = (s[x] + s[x+1] + ....s[y])* (s[p]+s[p+1]+....s[q]); 我们只需要枚举各字串的和以及其个数就可以得到所求小矩形的个数
解题代码:
#include <stdio.h> #include <string.h> char a[4005]; __int64 b[4005]; __int64 hs[40005]; __int64 sum[4005]; int main() { __int64 k ; scanf("%I64d",&k); scanf("%s",a); memset(hs,0,sizeof(hs)); __int64 len = strlen(a); for(__int64 i= 0 ;i < len ;i ++) { b[i+1] = a[i] - '0'; } sum[0] = 0 ; sum[1] = b[1]; for(__int64 i = 1;i <= len;i ++) sum[i] = sum[i-1] + b[i]; for(__int64 i = 0;i <= len;i ++) for(__int64 j = i+1; j<= len ; j ++ ) { hs[sum[j] - sum[i]] ++; } // printf("%I64d %I64d\n",hs[0],hs[1]); __int64 ans = 0 ; if(k != 0 ){ for(__int64 i = 1;i <= 40000;i ++) { if(k % i == 0 && (k / i) <= 40000) ans += hs[i] * hs[k/i]; } } else { ans = hs[0] *hs[0]; for(int i = 1 ;i <= 40000;i ++) ans += hs[i]*hs[0]*2; } printf("%I64d\n",ans); return 0; }
View Code
相关文章推荐
- 测试——设计思维之获取反馈
- C++学习之路(一)
- qt从x86架构移植到arm架构
- s5pv210启动流程简析
- 猜数字游戏
- UVA 10245 The Closest Pair Problem(传说中的分治法)
- JPEG2000和JPEG的比较
- 第十三周 使用递归函数输出最大公约数(第一次做 不知道对错 望高手指点)
- 循环引用问题
- 1.深入PHP变量存储结构
- sql server 取字符性日期
- 程序员的十层 成长之路
- 关于如何在matlab中添加新的工具箱的整理和心得
- 报数游戏
- 操作Excel导入的问题(转)
- java中判断用户是否为第一次登陆(在页面上进行控制)
- 读取加密的excel文档
- 测试code 代码片功能
- 第十三周 使用递归函数输出奇数的乘积
- 第一范式、第二范式及第三范式的定义与举例