一开始如果把他的行列输入理解为矩阵就错了。
先for从前往后扫一下,求出以每个行列为截止的最大线段长度。(这个跟求序列每个位置的连续递增长度类似)
然后枚举k的约数,将符合条件的行列个数求出来,并计数。
计数经验题。
const int N = 1e6 + 5;
int t;
int a[40010], b[40010];
int la[40010], lb[40010];
int main()
{
int n, m, k;
while (cin >> n >> m >> k)
{
f(i, 1, n)scanf("%d", &a[i]);
f(i, 1, m)scanf("%d", &b[i]);
f(i, 1, n)if(a[i]==1)la[i] = la[i - 1] + a[i];
f(i, 1, m)if(b[i]==1)lb[i] = lb[i - 1] + b[i];
ll ans=0,cot = 0, cot2 = 0;
f(i, 1, n)
{
if (k%i == 0)
{
cot = 0, cot2 = 0;
f(j, 1, n)
if (la[j] >= i)cot++;
f(j, 1, m)
if (lb[j] >= k / i)cot2++;
ans += cot * cot2;
}
}
cout << ans << endl;
}
return 0;
}