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
题意:
输入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
相关文章推荐
- Codeforces Round 389 Div.2 B. Santa Claus and Keyboard Check(模拟)
- CodeForces Round #278 (Div.2) (待续)
- Codeforces Round #267 Div.2 D Fedor and Essay -- 强连通 DFS
- Codeforces Aim Tech Round 3 (Div.2 )C.Letters Cyclic Shift 【贪心】水题
- Codeforces Round 190 div.2 322C 321A Ciel and Robot
- Codeforces round 244(div.2) D match&catch【字符串hash】
- Codeforces Round #410 (Div.2) C.Mike and gcd problem-数学
- Codeforces Round #212 (Div.2)
- Codeforces Round 389 Div.2 B. Santa Claus and Keyboard Check(模拟)
- codeforces Round #Pi (div.2) 567ABCD
- Codeforces Round #363 Div.2[111110]
- Codeforces Round #423 Div.2 A B C D E F
- CodeForces Round #290 Div.2
- Codeforces Round 190 div.2 322C 321A Ciel and Robot
- A. Puzzles CodeForces Round #196 (Div.2)
- Codeforces Round #434 (Div.2) - C - Did you mean...
- Codeforces Round #471 div.2 ABC题解
- Codeforces Round 389 Div.2 B. Santa Claus and Keyboard Check(模拟)
- Codeforces Round #398 (div.2)简要题解
- Codeforces Round 238 Div.2