您的位置:首页 > 其它

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]); 我们只需要枚举各字串的和以及其个数就可以得到所求小矩形的个数

解题代码:

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: