Problem p02972 (python)

Fixed submission:
#!/usr/bin/env python3
import sys
sys.setrecursionlimit(10 ** 7)

MOD = 2  # type: int


def solve(N: int, a: "List[int]"):
    ans = [0 for x in range(N)]
    for i in range(N - 1, -1, -1):
        s = 0
        for j in range(i, N, i + 1):
            s += ans[j]
        # print(s, a[i], s ^ a[i])
        if (s + a[i]) & 1:
            ans[i] = 1
    # print(ans)
    b = int(sum(ans))
    print(b)
    l = []
    if b:
        for i, x in enumerate(ans):
            if x == 1:
                l.append(i + 1)
        print(*l)
    return


# Generated by 1.1.5 https://github.com/kyuridenamida/atcoder-tools
# (tips: You use the default template now. You can remove this line by using your custom template)
def main():
    def iterate_tokens():
        for line in sys.stdin:
            for word in line.split():
                yield word
    tokens = iterate_tokens()
    N = int(next(tokens))  # type: int
    a = [int(next(tokens)) for _ in range(N)]  # type: "List[int]"
    solve(N, a)


if __name__ == '__main__':
    main()

Buggy submission (verdict: Runtime Error):
#!/usr/bin/env python3
import sys
import numpy as np
sys.setrecursionlimit(10 ** 7)

MOD = 2  # type: int


def solve(N: int, a: "List[int]"):
    a = np.array(a)
    ans = np.zeros(N)
    # print(ans)
    ans_idx = []
    for i in range(N - 1, -1, -1):
        # print(i)
        # print(list(range(i * 2 + 1, N, i + 1)))
        # print(ans[range(i * 2 + 1, N, i + 1)])
        # print()
        if (a[i] + ans[range(i * 2 + 1, N, i + 1)].sum()) % 2 == 0:
            ans[i] = 0
        else:
            ans[i] = 1
            ans_idx.append(i + 1)
    # print(ans)
    b = int(sum(ans))
    print(b)
    if b:
        print(*ans_idx)
    return


# Generated by 1.1.5 https://github.com/kyuridenamida/atcoder-tools
# (tips: You use the default template now. You can remove this line by using your custom template)
def main():
    def iterate_tokens():
        for line in sys.stdin:
            for word in line.split():
                yield word
    tokens = iterate_tokens()
    N = int(next(tokens))  # type: int
    a = [int(next(tokens)) for _ in range(N)]  # type: "List[int]"
    solve(N, a)


if __name__ == '__main__':
    main()

Buggy submission (verdict: Runtime Error):
#!/usr/bin/env python3
import sys
import numpy as np
sys.setrecursionlimit(10 ** 7)

MOD = 2  # type: int


def solve(N: int, a: "List[int]"):
    a = np.array(a)
    ans = np.zeros(N)
    # print(ans)
    ans_idx = []
    for i in range(N - 1, -1, -1):
        # print(i)
        # print(list(range(i * 2 + 1, N, i + 1)))
        # print(ans[range(i * 2 + 1, N, i + 1)])
        # print()
        if (a[i] + ans[range(i * 2 + 1, N, i + 1)].sum()) % 2 == 0:
            ans[i] = 0
        else:
            ans[i] = 1
            ans_idx.append(i + 1)
    # print(ans)
    b = int(sum(ans))
    print(b)
    if b:
        print(*ans_idx)
    return


# Generated by 1.1.5 https://github.com/kyuridenamida/atcoder-tools
# (tips: You use the default template now. You can remove this line by using your custom template)
def main():
    def iterate_tokens():
        for line in sys.stdin:
            for word in line.split():
                yield word
    tokens = iterate_tokens()
    N = int(next(tokens))  # type: int
    a = [int(next(tokens)) for _ in range(N)]  # type: "List[int]"
    solve(N, a)


if __name__ == '__main__':
    main()