Link to this code:
https://cses.fi/paste/bc4ea671691d162bf06613/import sys
import os
from math import log2, ceil
MOD = 10 ** 9 + 7
def inplist():
return [int(i) for i in input().split()]
def pow(a, b, mod):
x = 1
while b:
if b & 1:
x = (x * a) % mod
a = (a * a) % mod
b >>= 1
return x
def debug(**kwargs):
st = [f"{name}: {val}" for (name, val) in kwargs.items()]
print(*st, sep=" | ")
dp = [[0] * 5000 ** 2 for _ in range(2)]
def sieve(n):
if n < 2:
return []
# Create a boolean array "is_prime[0..n]" and initialize
# all entries it as true.
is_prime = [True] * (n + 1)
is_prime[0] = is_prime[1] = False
for p in range(2, int(n ** 0.5) + 1):
# If is_prime[p] is not changed, then it is a prime
if is_prime[p]:
# Update all multiples of p starting from p*p
# (multiples smaller than p*p have already been marked)
for i in range(p * p, n + 1, p):
is_prime[i] = False
# Return list of primes
return [p for p, prime in enumerate(is_prime) if prime]
primes = sieve(5000)
def subsetcount(arr):
if not arr: return 1
n = ceil(log2(5000))
oldState = [0] * (1 << n)
newState = [0] * (1 << n)
oldState[0] = 1
for a in arr:
for j in range(1 << n):
newState[j] = (oldState[j] + oldState[j ^ a]) % MOD
oldState = newState[::]
return newState[0]
def solve():
n = int(input())
arr = inplist()
ones = arr.count(1)
arr = [x for x in arr if x != 1]
arrmapped = []
for x in arr:
curr = 0
for p in primes:
while x % p == 0:
curr ^= p
x //= p
if x == 1: break
arrmapped.append(curr)
ones += arrmapped.count(0)
arrmapped = [x for x in arrmapped if x != 0]
sqpr = pow(2, ones, MOD)
return (sqpr * subsetcount(arrmapped)) % MOD
def main():
t = 1
# t=int(input())
for _ in range(t):
print(solve())
if __name__ == "__main__":
main()