内容
ポイント
- 大事なのは、偶奇なのでxorで管理できる。
- Aを直接更新しながら見ていく。
- 入力配列 Aで、後ろから見ていって、
- A[i]が1なら、その箱にボールを入れて、iの約数の箱も更新
- A[i]が0なら、もう条件を満たしているので、何もしない。
実装
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
put = []
for i in reversed(range(N)):
if A[i]:
put.append(i+1)
tmp = 1
n = i+1
while tmp*tmp <= n:
if n % tmp == 0:
A[tmp-1] ^= 1
if tmp != n//tmp:
A[n//tmp-1] ^= 1
tmp += 1
if len(put) > 0:
print(len(put))
print(*put)
else:
print(0)
終わりに
- 本番中に通せなくて悲しかった。
- 約数を見つけることろで、計算量を減らすために、while tmp*2<nにしていたのに、裏の約数?を考えるのを忘れていた。(裏の約数とは、a=bcの時に、bの裏の約数はcって意味と受け取ってほしい)