prefix_2D
=
[[
0
for
x
in
range
(
2005
)]
for
y
in
range
(
2005
)]
def
subMatrixSum(i, j, length):
return
(prefix_2D[i][j]
-
prefix_2D[i][j
-
length]
-
prefix_2D[i
-
length][j]
+
prefix_2D[i
-
length][j
-
length])
def
numberOfWays(a, b, n, m, k):
for
i
in
range
(
1
, n
+
1
):
for
j
in
range
(
1
, m
+
1
):
if
(a[i
-
1
]
=
=
b[j
-
1
]):
prefix_2D[i][j]
=
1
else
:
prefix_2D[i][j]
=
0
for
i
in
range
(
1
, n
+
1
):
for
j
in
range
(
1
, m
+
1
):
prefix_2D[i][j]
+
=
prefix_2D[i][j
-
1
]
for
i
in
range
(
1
, n
+
1
):
for
j
in
range
(
1
, m
+
1
):
prefix_2D[i][j]
+
=
prefix_2D[i
-
1
][j]
answer
=
0
for
i
in
range
(
1
, n
+
1
):
for
j
in
range
(
1
, m
+
1
):
low
=
1
high
=
min
(i, j)
while
(low < high):
mid
=
(low
+
high) >>
1
if
(subMatrixSum(i, j, mid) >
=
k):
high
=
mid
else
:
low
=
mid
+
1
if
(subMatrixSum(i, j, low) >
=
k):
answer
+
=
(
min
(i, j)
-
low
+
1
)
return
answer
if
__name__
=
=
"__main__"
:
N
=
2
M
=
3
A
=
[
1
,
2
]
B
=
[
1
,
2
,
3
]
K
=
1
print
(numberOfWays(A, B, N, M, K))