def solve1(N, AS):
ret = 0
P2 = []
P5 = []
for i in range(N):
p2 = 0
p5 = 0
x = AS[i]
while x % 2 == 0:
p2 += 1
x //= 2
while x % 5 == 0:
p5 += 1
x //= 5
P2.append(p2)
P5.append(p5)
for i in range(N):
for j in range(i + 1, N):
if P2[i] + P2[j] > 17 and P5[i] + P5[j] > 17:
ret += 1
return ret
for i in range(19, 0, -1):
P[i - 1] += P[i]
for i in range(19, 0, -1):
P[:, i - 1] += P[:, i]
これで一重ループで求められるようになる
python
for i in range(N):
ret += P[18 - P2[i], 18 - P5[i]]
だが、これだと正しい答えにならないので修正が必要
まず、P2もP5も9以上の数については「自分自身」をペアにカウントしてしまっているのでそれを引く
残りに関してはijペアとjiペアを両方カウントしているので2で割る
これで正解になる
python
def solve(N, AS):
import numpy as np
ret = 0
P2 = []
P5 = []
P = np.zeros((20, 20), dtype=np.int)
for i in range(N):
p2 = 0
p5 = 0
x = AS[i]
while x % 2 == 0:
p2 += 1
x //= 2
while x % 5 == 0:
p5 += 1
x //= 5
if p2 > 18:
p2 = 18
P2.append(p2)
P5.append(p5)
P[p2, p5] += 1
for i in range(19, 0, -1):
P[i - 1] += P[i]
for i in range(19, 0, -1):
P[:, i - 1] += P[:, i]
for i in range(N):
ret += P[18 - P2[i], 18 - P5[i]]
ret -= P[9, 9]
ret //= 2
return ret