矩形
2016-02-29 12:50
197 查看
矩形
题意:给定一个由数字(0-9)构成的字符串s。我们可以由此定义出size(s) * size(s) 大小的矩阵b,其中b[i][j] = s[i] * s[j];请问在这个矩阵b中,有多少子矩形满足其中的b[i][j]的和为另一个给定的数字a。对100%的输入数据:0 ≤a≤1000000000,size(s)≤4000
解法:细心观察可知,∑i=x1,j=y1i<=x2,j<=y2b[i][j]\sum_{i=x1,j=y1}^{ i<=x2,j<=y2}{b[i][j]}=∑i=x1i<=x2a[i]∗∑j=y1j<=y2a[j]=\sum_{i=x1}^{i<=x2}{a[i]}*\sum_{j=y1}^{j<=y2}{a[j]}那我们可以将∑i=x1i<=x2a[i](1<=x1<=x2<=n)\sum_{i=x1}^{ i<=x2}{a[i]}(1<=x1<=x2<=n)放进一个hash里面,但是我们发现其实他们不超过9*size(s)=9*4000=36000,用一个数组计数就可以了。再次枚举,查询a/sum的个数就是对答案的贡献。但是要特殊处理a=0且sum=0时任意数的个数就是对答案的贡献。
贴上代码
#include<set> #include<cmath> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) using namespace std; int const oo=2147483647; int const maxl=4000; typedef struct{int x,y;}note; inline int get(){ char ch=getchar();while((ch!='-')&&((ch<'0')||(ch>'9')))ch=getchar(); int u=1,v=0;if(ch=='-')u=-1;else v=ch-'0';ch=getchar(); while((ch>='0')&&(ch<='9'))v=v*10+ch-'0',ch=getchar(); return u*v; } inline char getch(){ char ch=getchar(); while((ch<'A')||(ch>'Z'))ch=getchar(); return ch; } int a,len,sum[maxl+10],cnt[maxl*10+10]; char s[maxl+10]; inline void scan(){ //srand(time(NULL)); //rand()%100; a=get(); scanf("%s",&s[1]); len=strlen(&s[1]); } inline void solve(){ fo(i,1,len) sum[i]=sum[i-1]+s[i]-'0'; fo(i,1,len) fo(j,i,len) cnt[sum[j]-sum[i-1]]++; int ans=0,totsum=0; fo(k,0,10*4000) totsum+=cnt[k]; fo(i,1,len) fo(j,i,len) if((sum[j]-sum[i-1]!=0)&&(a%(sum[j]-sum[i-1])==0)&&(a/(sum[j]-sum[i-1])<=10*4000)) ans+=cnt[a/(sum[j]-sum[i-1])]; else if((a==0)&&(sum[j]-sum[i-1]==0))ans+=totsum; printf("%d",ans); } int main(){ scan(); solve(); return 0; }
相关文章推荐
- Netmap 高性能网络I/O框架
- 如何诊断 11.2 集群节点驱逐问题 (文档 ID 1674872.1) 转到底部转到底部
- Python中用format函数格式化字符串的用法
- 解决android studio报错问题( Failed to complete Gradle ...
- 常用算法参考
- UINavigationController之Toolbar+ToolbarItems
- 处理 Oracle 块损坏 (文档 ID 1526911.1)
- 同事写的快排算法
- 两个栈模拟一个数列
- 面试常问 Java基础 冒泡排序
- js事件代理(委托)
- Android常见控件— — —TextView
- 微信之旅——订阅号和服务号
- STL 相关分析参考
- 在VS中添加lib库的三种方法
- fft分析前后频谱数据
- 对于诊断 Oracle Clusterware(CRS 或 GI)和 Real Application Cluster(RAC)问题的数据收集 (文档 ID 2017246.1)
- 如何(Deconfigure)解除配置/(Reconfigure)重新配置(重建 OCR)或卸载 GI (文档 ID 2016852.1)
- 妙计旅行-interveiw
- sql 索引的分类