求一个字符串中的两个子串的乘积是否为a的种类数(和顺序有关)
2015-06-01 13:54
302 查看
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <string> #include <vector> #include <queue> //CF213 Div2(C) 求两个子串的乘积是否为a的种类数 #define N 40000 #define LL long long using namespace std; LL vis ; //vis 数组是表示字串和为n的个数 int main() { char s[4010]; int i, t, j, a, g, b[4010]; while(scanf("%d", &a)!=EOF) { scanf("%s", s); j=strlen(s); for(t=0; t<j; ++t) { if(t==0)b[t]=s[t]-'0'; else b[t]=b[t-1]+s[t]-'0'; } for(i=0; i<j; ++i) //计算不同字串和的个数 { for(t=i; t<j; ++t) { if(i==0) g=b[t]; else g=b[t]-b[i-1]; vis[g]++; } } LL sum; if(!a) { for(t=1, sum=0; t<=40000; ++t) sum+=vis[t]; //有顺序前后之分,所以要乘以2 printf("%I64d\n", sum*2*vis[0]+vis[0]*vis[0]); //前面是0和以外的数搭配,后面是0和0自己搭配 continue; } for(t=1, sum=0; t<=40000; ++t) { if(a%t==0&&a/t<=40000) //数组b最大的范围小于40000,a/t<=40000如果没有的话会越界 sum+=vis[t]*vis[a/t]; } printf("%I64d\n", sum); } return 0; }
相关文章推荐
- hdu 2457 ac自动机dp
- 关于excel更改单元格式不会立刻生效的问题
- 探寻Google Photos无限免费的“真相”
- 一分钟实现 Android textview 跑马灯文字滚动效果
- [STL][C++]LIST
- Android中layout过程详解
- 菜鸟学Android笔记(十五):Tomcat、web应用配置和综合演练
- MySQL数据库使用命令行备份
- freeNAS部署
- egret的一些小技巧
- Oracle 树操作(select…start with…connect by…prior)
- Deep Learning(深度学习)学习系列之(一)
- 获取Spring-boot系统环境变量方法
- python--FTP两个文件夹间的同步
- JNI知识总结
- 马化腾:MSN曾是QQ最大的对手,但没赶上社交化,被Facebook打掉
- 想赚钱怎么办?靠辛苦和努力就能赚大钱吗?
- 第一个struts2程序
- Eclipse中安装使用SVN
- Android开发中常用的跳转系统自带界面方法(ACTION)