您的位置:首页 > 其它

Codeforces Round#213(div.2)

2013-11-20 22:58 387 查看
C.Matrix

题意:

输入a和s。 s是只包含数字的字符串,b是一个矩阵,矩阵内的元素满足bij=si*sj。查找有多少个子矩阵,能满足这个子矩阵内的所有元素和为a。

思路:

注意一点:

子矩阵的横坐标、纵坐标上的数分别为(x,y,z,...)、(a,b,c,...),则子矩阵内元素和等于(a+b+c+...) * (x+y+z+...)。

由这点可将问题转化为求有多少种情况,令m*n==a。而m、n来自s的子串内digit之和。

因此枚举s的所有连续子串,保存下所有子串内digit和及个数。

当a不等于0时,枚举a的因子。

当a等于0时,只考虑num[0]。

PS:重复计算的情况为当横纵两数相等时 。

参考:/article/1783632.html

1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4
5 #define N 40000
6 #define M 4010
7 long long num
, digit[M];
8 char s[M];
9
int main()
{
long long a;
cin >> a >> s;
int len = strlen(s);
for(int i=0; i<len; i++)
{
digit[i+1] = s[i] - '0';
}
memset(num, 0, sizeof(num));
long long zero = 0;
for(int i=1; i<=len; i++)
{
long long temp = 0;
for(int j=i; j<=len; j++)
{
temp += digit[j];
num[temp]++;
zero++;
}
}
long long ans = 0;
//重复计算的情况为当横纵两数相等时
if(a==0)
{
ans = num[0] * zero * 2 - num[0]*num[0];
}
else
{
for(int i=1; i*i<=a; i++)
{
if(num[i]>0 && a/i<=N && a%i==0)
{
if(i * i == a)
ans += num[i] * num[i];
else
ans += num[i] * num[a/i] * 2;
}
}
}
cout << ans << endl;
return 0;
}View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: