题意:
给出序列
a
a
a 和序列
b
b
b
矩阵
c
c
c 是由
a
a
a 和
b
b
b 决定的
c
i
j
=
=
a
i
b
j
c_{ij}==a_ib_j
cij==aibj
问你可以从中截取多少个面积为
k
k
k 的子矩阵。
显然可知的一个性质那就是当 a a a 序列 1 1 1 连续长度为 x x x, b b b 序列 1 1 1 连续长度为 y y y, x ∗ y = = k x*y==k x∗y==k 时这个部分序列形成的矩阵肯定符合,我们只有枚举 a a a 中连续长度为 k k k 的因子, b b b 中连续长度为 k x \frac{k}{x} xk 的,然后找有多少满足的序列,相乘求和即可。
AC代码:
int n, m, k;
int res,cnt;
const int N = 4e4 + 5;
int a[N], b[N];
int c[100010];
int x, y;
int main()
{
sddd(n, m, k);
rep(i, 1, n)
sd(a[i]);
rep(i, 1, m)
sd(b[i]);
cnt = 0;
ll ans = 0;
for (int i = 1; i * i <= k; i++)
{
if (k % i == 0)
{
c[cnt++] = i;
if (i == k / i)
continue;
c[cnt++] = k / i;
}
}
rep(i, 0, cnt-1)
{
res = 0;
x = 0, y = 0;
rep(j, 1, n)
{
if (a[j] == 1)
res++;
else
res = 0;
if (res == c[i])
res--, x++;//res--是去掉头上的那一个
}
res = 0;
rep(j, 1, m)
{
if (b[j] == 1)
res++;
else
res = 0;
if (res == k / c[i])
res--, y++;
}
ans += x * y;
}
pld(ans);
return 0;
}