Problem:


Score : 300 points

Problem Statement

There are N people, conveniently numbered 1 through N.
They were standing in a row yesterday, but now they are unsure of the order in which they were standing.
However, each person remembered the following fact: the absolute difference of the number of the people who were standing to the left of that person, and the number of the people who were standing to the right of that person.
According to their reports, the difference above for person i is A_i.

Based on these reports, find the number of the possible orders in which they were standing.
Since it can be extremely large, print the answer modulo 10^9+7.
Note that the reports may be incorrect and thus there may be no consistent order.
In such a case, print 0.

Constraints

1≦N≦10^5

0≦A_i≦N-1

Input

The input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the number of the possible orders in which they were standing, modulo 10^9+7.

Sample Input 1

5
2 4 4 0 2

Sample Output 1

4

There are four possible orders, as follows:

2,1,4,5,3

2,5,4,1,3

3,1,4,5,2

3,5,4,1,2

Sample Input 2

7
6 4 0 2 4 0 2

Sample Output 2

0

Any order would be inconsistent with the reports, thus the answer is 0.

Sample Input 3

8
7 5 1 1 7 3 5 3

Sample Output 3

16



Sample input:
5
2 4 4 0 2


Sample output:
4

Submission status: Accepted

Solution code:
N = int(input())
A = list(map(int, input().split()))
mod = 10 ** 9 + 7

A = sorted(A)
ans = 1
if N % 2 == 0:#[1,1,3,3,5,5,...]
  for i in range(N):
    xx = int(i / 2)
    if A[i] != 2 * xx + 1:
      ans = 0
    else:
      if i % 2 == 1:
        ans *= 2
        ans %= mod
else:#[0, 2, 2, 4, 4 ...]
  for i in range(N):
    xx = int((i + 1)/2)
    if A[i] != 2 * xx:
      ans = 0
    else:
      if (i % 2 == 0) and (i != 0):
        ans *= 2
        ans %= mod
      
      
  
  
print(ans)

Submission status: Accepted

Solution code:
n=int(input())
a=[int(i) for i in input().split()]

def somosomo(a):
    ans=[]
    if n%2==1:
        ans.append(0)
        for i in range(1,n//2+1):
            ans.append(i*2)
            ans.append(i*2)
        b=sorted(a)
        if b==ans:
            return True
        return False
    else:
        for i in range(1,n//2+1):
            ans.append(i*2-1)
            ans.append(i*2-1)
        b=sorted(a)
        if b==ans:
            return True
        return False

def two_ride(n):
    ans=1
    for i in range(n):
        ans*=2
        ans%=10**9+7
    return ans

if somosomo(a):
    print(two_ride(n//2))
else:
    print(0)

Submission status: Accepted

Solution code:
import sys
import math
import itertools
import bisect
from copy import copy,deepcopy
from collections import deque,Counter
from decimal import Decimal
def s(): return input()
def i(): return int(input())
def S(): return input().split()
def I(): return map(int,input().split())
def L(): return list(map(int,input().split()))
def l(): return list(map(int,input().split()))
def lcm(a,b): return a*b//math.gcd(a,b)
sys.setrecursionlimit(10 ** 9)
INF = 10**9
mod = 10**9+7

N = i()
A = l()
ans = 1
l = [0]*N
for i in range(N):
    l[A[i]] += 1
for i in range(N):
    c = l[i]
    if N%2 == i%2:
        if c:
            ans *= 0
    else:
        if c == 0:
            ans *= 0
        if c == 1:
            if i != 0:
                ans *= 0
        if c == 2:
            ans *= 2
print(ans%mod)

Submission status: Accepted

Solution code:
from collections import Counter

n=int(input())
a=list(map(int,input().split()))

c=Counter(a)
ans=1
if n%2==1:
    for i in range(n):
        if i%2==1 and c[i]>0:
            ans=0
            break
        elif i%2==0 and c[i]==2:
            ans*=2
            ans%=1000000007
        if i==0 and c[i]!=1:
            ans=0
            break
else:
    for i in range(n):
        if i%2==0 and c[i]>0:
            ans=0
            break
        elif i%2==1 and c[i]==2:
            ans*=2
            ans%=1000000007
print(ans)

Submission status: Accepted

Solution code:
import sys

# n = 10 ** 5
# データ読み込み関係
n = int(input())

a = list(map(int, input().split(' ')))

record = {}

possible = True

# 状況が実現可能か確認
for e in a:
    if(e in record.keys()):
        record[e] += 1
        if(record[e] == 2):
            if(e == 0):
                possible = False
                break
        if(record[e] == 3):
            possible = False
            break
    else:
        record[e] = 1

if(possible == False):
    print(0)
    sys.exit()

multiCount = int(n / 2)

print(2 ** multiCount % (10 ** 9 + 7))

Submission status: Accepted

Solution code:
n = int(input())
arr = list(map(int , input().split()))
mod = 10**9+7
h = [0 for i in range(0,n)]
for i in range(0,n):
	h[arr[i]]=h[arr[i]]+1
	if n%2==0 and arr[i]==0:
		print(0)
		exit()
ans=1
if n%2:
	for i in range(2 ,n, 2):
		if h[i]!=2:
			print(0)
			exit()
		ans = (ans*2)%mod
else:
	for i in range(1, n , 2):
		if h[i]!=2:
			print(0)
			exit()
		ans = (ans*2)%mod
print(ans)

Submission status: Accepted

Solution code:
n = int(input())
a = list(map(int,input().split()))
mod = 10**9+7

a.sort()

if n%2 == 1: 
    if a[0] != 0:
        print(0)
        exit()
    else:
        a.remove(0)
        tmp = 2
else:
    tmp = 1

for i in range(n//2):
    if tmp == a[0] and tmp == a[1]:
        a.remove(tmp)
        a.remove(tmp)
    else:
        print(0)
        exit()
    tmp += 2

if len(a) == 0:
    print((2**(n//2))%mod)
else:
    print(0)

Submission status: Accepted

Solution code:
n=int(input())
lst=list(map(int,input().split()))
if n%2==0:
    cnt=[0]*n
    for i in range(n):
        p=lst[i]
        if p%2==0:
            print(0)
            exit()
        cnt[p]+=1
        if cnt[p]>=3:
            print(0)
            exit()
    print(pow(2,n//2,10**9+7))
else:
    cnt=[0]*n
    for i in range(n):
        p=lst[i]
        if p%2==1:
            print(0)
            exit()
        cnt[p]+=1
        if p==0:
            if cnt[0]>=2:
                print(0)
                exit()
        else:
            if cnt[p]>=3:
                print(0)
                exit()
    print(pow(2,n//2,10**9+7))

Submission status: Accepted

Solution code:
import sys

read = sys.stdin.read
readline = sys.stdin.readline
readlines = sys.stdin.readlines
sys.setrecursionlimit(10 ** 9)
INF = 1 << 60
MOD = 1000000007


def main():
    N, *A = map(int, read().split())

    A.sort()

    ok = True
    if len(A) % 2 == 0:
        for i in range(N // 2):
            if not A[2 * i] == A[2 * i + 1] == 2 * i + 1:
                ok = False
                break
    else:
        if A[0] != 0:
            ok = False
        else:
            for i in range(N // 2):
                if not A[2 * i + 1] == A[2 * i + 2] == 2 * i + 2:
                    ok = False
                    break

    if ok:
        ans = pow(2, N // 2, MOD)
    else:
        ans = 0

    print(ans)

    return


if __name__ == '__main__':
    main()

Submission status: Accepted

Solution code:
N=int(input())
A=list(map(int,input().split()))

A.sort()
check=[0]*N

for idx in range(N%2,N,2):
    check[idx]=idx+1
    check[idx+1]=idx+1

ans=0
mod=10**9+7
if check==A:
    if N%2==0:
        ans=(2**(N//2))%mod
    else:
        ans=(2**((N-1)//2))%mod
print(ans)

Submission status: Accepted

Solution code:
N = int(input())
A = list(map(int,input().split()))
   
A.sort()

check=[0]*N

for idx in range(N%2,N,2):
    check[idx]=idx+1
    check[idx+1]=idx+1

ans=0

if check == A:
    if N % 2 == 0:
        ans=(2**(N//2))%(10**9+7)
    elif N % 2 != 0:
        ans=(2**((N-1)//2))%(10**9+7)
    
print(ans)

Submission status: Accepted

Solution code:
import sys
import itertools
# import numpy as np
import time
import math
import heapq
from collections import defaultdict
sys.setrecursionlimit(10 ** 7)
 
INF = 10 ** 18
MOD = 10 ** 9 + 7
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines

# map(int, input().split())

N = int(input())
A = list(map(int, input().split()))

X = [0] * N
for i, a in enumerate(A):
    j = (N - 1 - a) // 2
    X[j] += 1

for i, x in enumerate(X):
    if x == 1 and not (i == (N + 1) // 2 - 1):
        print(0)
        exit()
    if x > 2:
        print(0)
        exit()

ans = 1
for x in X:
    if x == 0:
        break
    ans *= x
    ans %= MOD
print(ans)

Submission status: Accepted

Solution code:
n = int(input())
a = list(map(int, input().split()))
flg = 0

a.sort()
if n % 2 == 0:
  if a[0] == 1 and a[1] == 1:
    for i in range(2, n, 2):
      if a[i] == a[i + 1] and a[i - 1] + 2 == a[i]:
        continue
      else:
        flg = 1
        break
  else:
    flg = 1
else:
  if a[0] == 0:
    for i in range(1, n, 2):
      if a[i] == a[i + 1] and a[i - 1] + 2 == a[i]:
        continue
      else:
        flg = 1
        break
  else:
    flg = 1

if flg == 1:
  print(0)
else:
  print((2 ** (n // 2)) % (10 ** 9 + 7))

Submission status: Accepted

Solution code:
import bisect, collections, copy, heapq, itertools, math, string, sys
input = lambda: sys.stdin.readline().rstrip() 
sys.setrecursionlimit(10**7)
INF = float('inf')
MOD = 10 ** 9 + 7
def I(): return int(input())
def F(): return float(input())
def SS(): return input()
def LI(): return [int(x) for x in input().split()]
def LI_(): return [int(x)-1 for x in input().split()]
def LF(): return [float(x) for x in input().split()]
def LSS(): return input().split()

def resolve():
    N = I()
    A = LI()

    if N % 2 == 0:
        if sorted(A) == [i // 2 * 2 + 1 for i in range(N)]:
            print(pow(2, N // 2, MOD))
        else:
            print(0)
    else:
        if sorted(A) == [(i // 2 + 1) * 2 for i in range(-1, N - 1)]:
            print(pow(2, (N - 1) // 2, MOD))
        else:
            print(0)

if __name__ == '__main__':
    resolve()

Submission status: Accepted

Solution code:
N = int(input())
A = sorted(list(map(int,input().split())))

if N%2==0:
  B = [1+2*(n//2) for n in range(N)]
else:
  B = [2*(n//2) for n in range(1,1+N)]

if A==B:
  print(pow(2,N//2,10**9+7))
else:
  print(0)

Submission status: Accepted

Solution code:
N = int(input())
A = sorted(list(map(int,input().split())))

if N%2==0:
  B = [2*(n//2)+1 for n in range(N)]
else:
  B = [2*(n//2) for n in range(1,N+1)]

if A==B:
  print(pow(2,N//2,10**9+7))
else:
  print(0)

Submission status: Accepted

Solution code:
n = int(input())
a = list(map(int,input().split()))
mod = 10**9 + 7

d = [0]*(n+1)
for x in a:
    d[x] += 1
ans = 1
if n%2 == 0:
    sw = 1
    for i,x in enumerate(d):
        if i%2 != 0:
            if x == 2:
                ans *= 2
                ans %= mod
            else:
                sw = 0
                break
        else:
            if x != 0:
                sw = 0
                break
else:
    sw = 1
    for i,x in enumerate(d):
        if i%2 == 0:
            if i == 0:
                if x != 1:
                    sw = 0
                    break
            else:
                if x == 2:
                    ans *= 2
                    ans %= mod
                else:
                    sw = 0
                    break
        else:
            if x != 0:
                sw = 0
                break
if sw == 0:
    ans = 0
print(ans)

Submission status: Accepted

Solution code:
import sys
from collections import deque
p=10**9+7

def main(n,a):
  h=n//2
  g=n%2
  a.sort()
  c=[2*(x//2)+g+1 for x in range(n-g)]
  if g==1:
    c.insert(0,0)
  if a!=c:
      return 0
  return 2**(h%(p-1)) % p

if __name__=='__main__':
  n=int(input())
  a=list(map(int,sys.stdin.readline().strip().split()))
  print(main(n,a))

Submission status: Accepted

Solution code:
import math

N = 5
ARR = [2, 4, 4, 0, 2]

N = 7
ARR = [6, 4, 0, 2, 4, 0, 2]
#
# N = 8
# ARR = [7, 5, 1, 1, 7, 3, 5, 3]
#
N = int(input())
ARR = list(map(int, input().split()))


def calculate(n, arr):
    if n % 2 == 0:
        n = n // 2
        start = 1
        finalResult = pow(2, n, 1000000000 + 7)
    else:
        n = n // 2 + 1
        start = 0
        finalResult = pow(2, (n - 1), 1000000000 + 7)

    result = {}
    for i in range(n):
        index = start + 2 * i
        if index == 0:
            result.__setitem__(0, 1)
        else:
            result.__setitem__(index, 2)

    isOk = True
    for i in range(len(arr)):
        if result.get(arr[i]) == None:
            isOk = False
            break

        if result.get(arr[i]) == 0:
            isOk = False
            break

        result.__setitem__(arr[i], result.get(arr[i])-1)

    if isOk == False:
        print(0)
        return

    if sum(result.values()) == 0:
        print(finalResult)
    else:
        print(0)


calculate(N, ARR)

Submission status: Accepted

Solution code:
MOD = 10 ** 9 + 7
num = [0] * (10 ** 5 + 1)
N = int(input())
A = list(map(int,input().split()))
for i in range(len(A)):
	num[A[i]] += 1
if N % 2 == 1:
	for i in range(0,N,2):
		cnt = num[i]
		if i == 0:
			if cnt != 1:
				print(0)
				exit()
		else:
			if cnt != 2:
				print(0)
				exit()
	print(2 ** (N // 2) % MOD)
else:
	for i in range(1,N,2):
		cnt = num[i]
		if cnt != 2:
			print(0)
			exit()
	print(2 ** (N // 2) % MOD)

Submission status: Accepted

Solution code:
mod = 10 ** 9 + 7
n = int(input())
a = list(map(int, input().split()))

a.sort()

if n % 2 == 0:
    for i in range(n):
        if i % 2 == 0:
            if a[i] != i + 1:
                print(0)
                exit()
        else:
            if a[i] != i:
                print(0)
                exit()
    print(pow(2, n//2, mod))

else:
    for i in range(n):
        if i % 2 == 0:
            if a[i] != i:
                print(0)
                exit()
        else:
            if a[i] != i + 1:
                print(0)
                exit()
    print(pow(2, n//2, mod))

Submission status: Accepted

Solution code:
n = int(input())
a = sorted(list(map(int, input().split())))
ans = 1

if n%2 == 0:
    for i in range(0, n, 2):
        if a[i] != i + 1 or a[i + 1] != i + 1:
            print(0)
            exit()
else:
    if a[0] != 0:
        print(0)
        exit()
    for i in range(1, n, 2):
        if a[i] != i + 1 or a[i + 1] != i + 1:
            print(0)
            exit()

for i in range(n//2):
    ans = ans*2%(10**9 + 7)

print(ans)

Submission status: Accepted

Solution code:
def main():
  N=int(input())
  A=list(map(int,input().split()))
  mod=10**9+7
  ans=1
  A.sort()
  if N%2==0:
    for i in range(0,N,2):
      if A[i]!=A[i+1] or A[i]!=i+1:
        print(0)
        exit()
      ans=ans*2%mod
    print(ans)
  else:
    if A[0]!=0:
      print(0)
      exit()
    ans=1
    for i in range(1,N,2):
      if A[i]!=A[i+1] or A[i]!=i+1:
        print(0)
        exit()
      ans=ans*2%mod
    print(ans)
if __name__=='__main__':
  main()

Submission status: Accepted

Solution code:
import sys, os, math, bisect, itertools, collections, heapq, queue
# from scipy.sparse.csgraph import csgraph_from_dense, floyd_warshall
from decimal import Decimal
from collections import defaultdict, deque

sys.setrecursionlimit(10000000)

ii = lambda: int(sys.stdin.buffer.readline().rstrip())
il = lambda: list(map(int, sys.stdin.buffer.readline().split()))
fl = lambda: list(map(float, sys.stdin.buffer.readline().split()))
iln = lambda n: [int(sys.stdin.buffer.readline().rstrip()) for _ in range(n)]

iss = lambda: sys.stdin.buffer.readline().decode().rstrip()
sl = lambda: list(map(str, sys.stdin.buffer.readline().decode().split()))
isn = lambda n: [sys.stdin.buffer.readline().decode().rstrip() for _ in range(n)]

lcm = lambda x, y: (x * y) // math.gcd(x, y)

MOD = 10 ** 9 + 7
MAX = float('inf')


def main():
    if os.getenv("LOCAL"):
        sys.stdin = open("input.txt", "r")

    N = ii()
    A = il()
    cnt = collections.Counter(A)

    start = 1 if N % 2 == 0 else 0
    m = 0
    for n in range(start, N, 2):
        if n == 0 and cnt[n] == 1:
            continue
        elif cnt[n] == 2:
            m += 1
            continue
        else:
            print(0)
            exit()
    print((2**m)%MOD)


if __name__ == '__main__':
    main()

Submission status: Accepted

Solution code:
N = int(input())
A = list(map(int, input().split()))

ans = 0
A_test = sorted(list(set(A)))

if N % 2 == 1:
    judge = [i for i in range(0,N,2)]
    if (A_test == judge) and (A.count(0) == 1):
        ans = 2**(N//2)
else:
    judge = [i for i in range(1,N,2)]
    if A_test == judge:
        ans = 2**(N//2)

ans = ans % (10**9 + 7)
print(ans)

Submission status: Accepted

Solution code:
N=int(input())
S=list(map(int,input().split()))
lenS=len(S)
T=[]
for i in range(1,N+1):
    T.append(abs(i-(N+1-i)))

T.sort()
S.sort()



for i in range(N):
    if T[i]!=S[i]:
        print(0)
        exit()


ans=1
nagasa=lenS//2
for i in range(nagasa):
    
    ans=(ans*2)%(10**9+7)

print(ans)

Submission status: Accepted

Solution code:
from collections import Counter

N,*A = map(int, open(0).read().split())
ac = Counter(A)
if N % 2 == 0:
    for i in range(1,N,2):
        if ac[i] != 2:
            print(0)
            break
    else:
        print(pow(2,N//2,1000000007))
else:
    if ac[0] != 1:
        print(0)
    else:
        for i in range(2,N,2):
            if ac[i] != 2:
                print(0)
                break
        else:
            print(pow(2,N//2,1000000007))

Submission status: Accepted

Solution code:
import sys
import numpy as np
import random
from decimal import Decimal
import itertools
import re
import bisect
from collections import deque, Counter
from functools import lru_cache

sys.setrecursionlimit(10**9)
INF = 10**13
def LI(): return list(map(int, sys.stdin.buffer.readline().split()))
def I(): return int(sys.stdin.buffer.readline())
def LS(): return sys.stdin.buffer.readline().rstrip().decode('utf-8').split()
def S(): return sys.stdin.buffer.readline().rstrip().decode('utf-8')
def IR(n): return [I() for i in range(n)]
def LIR(n): return [LI() for i in range(n)]
def SR(n): return [S() for i in range(n)]
def LSR(n): return [LS() for i in range(n)]
def SRL(n): return [list(S()) for i in range(n)]
def MSRL(n): return [[int(j) for j in list(S())] for i in range(n)]
def SERIES(n): return np.fromstring(sys.stdin.buffer.read(), dtype=np.int32, sep=' ')
def GRID(h,w): return np.fromstring(sys.stdin.buffer.read(), dtype=np.int32, sep=' ').reshape(h,-1)[:,:w]
def GRIDfromString(h,w): return np.frombuffer(sys.stdin.buffer.read(), 'S1').reshape(h,-1)[:,:w]
MOD = 1000000007

def main():
	n = I()
	a_list = LI()
	a_dict = list(Counter(a_list).items())
	a_dict.sort()
	ans = 1
	if n % 2 == 0:
		for i in range(len(a_dict)):
			diff, number = a_dict[i]
			if diff % 2 == 0:
				ans = 0
				break
			if diff != 2*i+1 or number != 2:
				ans = 0
				break
			ans *= 2
			ans %= MOD
	else:
		for i in range(len(a_dict)):
			diff, number = a_dict[i]
			if diff % 2 == 1 or (diff == 0 and number !=1):
				ans = 0
				break
			if diff != 2*i or (diff > 0 and number != 2):
				ans = 0
				break
			if diff != 0:
				ans *= 2
				ans %= MOD
	print(int(ans))


	


if __name__ == '__main__':
    main()

Submission status: Accepted

Solution code:
import collections
import sys
input = sys.stdin.readline

N = int(input())
A = list(map(int,input().split()))
m = 1000000007

flag0 = 1
count = 0
#偶数だったら
if N %2 ==0:
    colA = collections.Counter(A)
    for key,val in colA.items():
        if key%2 != 1 or val != 2:
            flag0 = 0
            break
    for i in range(1,N,2):
        if i not in colA.keys():
            flag = 0
            break
        else:
            count +=1
#奇数だったら
else:
    A.append(0)
    colA = collections.Counter(A)
    for key,val in colA.items():
        if key%2 != 0 or val != 2:
            flag0 = 0
            break
    for i in range(0,N,2):
        if i not in colA.keys():
            flag = 0
            break
        else:
            count +=1
    count -=1


print(((2**count)%m)*flag0)

Submission status: Accepted

Solution code:
n = int(input())
A = tuple(map(int, input().split()))
mod = 10**9+7

niseven = (n%2 == 0)

cd = dict()
for a in (A):
    cd.setdefault(a, 0)
    cd[a] += 1
    if a == 0 and cd[a] > 1:
        print(0)
        break
    if a > 0 and cd[a] > 2:
        print(0)
        break
    if (a%2==0) == niseven:
        print(0)
        break
else:
    print(pow(2, n//2, mod))

Submission status: Accepted

Solution code:
import sys, os, math, bisect, itertools, collections, heapq, queue
# from scipy.sparse.csgraph import csgraph_from_dense, floyd_warshall
from decimal import Decimal
from collections import defaultdict, deque

# import fractions

sys.setrecursionlimit(10000000)

ii = lambda: int(sys.stdin.buffer.readline().rstrip())
il = lambda: list(map(int, sys.stdin.buffer.readline().split()))
fl = lambda: list(map(float, sys.stdin.buffer.readline().split()))
iln = lambda n: [int(sys.stdin.buffer.readline().rstrip()) for _ in range(n)]

iss = lambda: sys.stdin.buffer.readline().decode().rstrip()
sl = lambda: list(map(str, sys.stdin.buffer.readline().decode().split()))
isn = lambda n: [sys.stdin.buffer.readline().decode().rstrip() for _ in range(n)]

lcm = lambda x, y: (x * y) // math.gcd(x, y)
# lcm = lambda x, y: (x * y) // fractions.gcd(x, y)

MOD = 10 ** 9 + 7
MAX = float('inf')


def main():
    if os.getenv("LOCAL"):
        sys.stdin = open("input.txt", "r")

    N = ii()
    A = il()
    cnt = collections.Counter(A)

    for k, v in cnt.items():
        if k == 0 and v != 1:
            print(0)
            exit()
        elif k != 0 and v != 2:
            print(0)
            exit()
    print((2 ** (N // 2))%MOD)


if __name__ == '__main__':
    main()

Submission status: Accepted

Solution code:
import sys

readline = sys.stdin.readline
MOD = 10 ** 9 + 7
INF = float('INF')
sys.setrecursionlimit(10 ** 5)


def main():
    from collections import Counter

    n = int(readline())
    a = list(map(int, readline().split()))
    counter = Counter(a)
    ok = True

    if n % 2 == 1:
        if counter[0] != 1:
            ok = False

        for i in range(2, n, 2):
            if counter[i] != 2:
                ok = False
    else:
        for i in range(1, n, 2):
            if counter[i] != 2:
                ok = False

    if ok:
        print(pow(2, n // 2, MOD))
    else:
        print(0)


if __name__ == '__main__':
    main()

Submission status: Accepted

Solution code:
N = int(input())
K = [0 for i in range(N+1)]
A = list(map(int,input().rstrip().split(" ")))
ans = 1
for i in A:
    K[i] += 1
for i in range(N):
    if i != 0 and K[i] != 0 and K[i] != 2:
        ans = 0
        break
    if K[i] == 2:
        ans *= 2
        ans %= 10 ** 9 + 7
print(ans)

Submission status: Accepted

Solution code:
n = int(input())
a = sorted(list(map(int, input().split())))

if len(a)%2==1:
    tmp = [0]
    for i in range((len(a)-1)//2):
        tmp.append((i+1)*2)
        tmp.append((i+1)*2)
    if a == tmp:
        ans = (2**((len(a)-1)//2))%(10**9+7)
    else:
        ans = 0
else:
    tmp = []
    for i in range(len(a)//2):
        tmp.append(2*i+1)
        tmp.append(2*i+1)
    if a == tmp:
        ans = (2**(len(a)//2))%(10**9+7)
    else:
        ans = 0
print(ans)

Submission status: Accepted

Solution code:
n=int(input())
A=list(map(int,input().split()))
A.sort()
judge=0
if n%2==1:
    for i in range(n):
        if A[i]!=2*((i+1)//2):
            judge+=1
            break
else:
    for i in range(n):
        if A[i]!=2*(i//2)+1:
            judge+=1
            break
if judge==1:
    print(0)
else:
    print((2**(n//2))%(10**9+7))

Submission status: Accepted

Solution code:
from collections import Counter

N = int(input())
A = list(map(int, input().split()))
MOD = int(1e9) + 7

# 偶数の場合
if N % 2 == 0:
    c = Counter(A)
    if all(i == 2 for i in c.values()):
        print(pow(2, N//2, MOD))
    else:
        print(0)
# 奇数の場合
else:
    A.sort()
    A = A[1:]
    c = Counter(A)
    if all(i == 2 for i in c.values()):
        print(pow(2, N//2, MOD))
    else:
        print(0)

Submission status: Accepted

Solution code:
N = int(input())
A = list(map(int, input().split()))

m = 1000000007

A.sort()
if N % 2 == 0:
    B = list(range(1, N, 2)) * 2
else:
    B = [0] + list(range(2, N, 2)) * 2
B.sort()

if A != B:
    print(0)
else:
    result = 1
    for i in range(N // 2):
        result *= 2
        result %= m
    print(result)

Submission status: Accepted

Solution code:
import sys
from collections import Counter
N = int(input())
A = list(map(int, input().split()))
MOD = 10 ** 9 + 7

C = Counter(A)
C = sorted(C.items(), key=lambda x: x[0])
if N % 2 == 0:
    s = 1
    for k, v in C:
        if k != s or v != 2:
            print(0)
            sys.exit()
        s += 2
    print(pow(2, (N // 2), MOD))
else:
    s = 0
    for k, v in C:
        if k == 0:
            if k != 0 or v != 1:
                print(0)
                sys.exit()
            s += 2
            continue
        if k != s or v != 2:
            print(0)
            sys.exit()
        s += 2
    print(pow(2, (N - 1) // 2, MOD))

Submission status: Accepted

Solution code:
import sys
from collections import Counter

n = int(input())
a = list(map(int, input().split()))
a.sort()

l = []

for i in range(n):
    li = abs(i - (n-1-i))
    l.append(li)
    
l.sort()


for ai, li in zip(l,a):
    if ai != li:
        print(0)
        sys.exit()

d = Counter(l)
mod = 10 ** 9 + 7
ans = 1

for li in d:
    for j in range(1,d[li]+1):
        ans *= j
        ans %= mod

print(ans)

Submission status: Accepted

Solution code:
MOD = 10**9+7


def read_int():
    return int(input().strip())


def read_ints():
    return list(map(int, input().strip().split(' ')))


def pow(b, p):
    ans = 1
    for _ in range(p):
        ans = (ans*b)%MOD
    return ans


def solve():
    """
    if N is odd, 
    N-1 : 2
    N-3 : 2
    0   : 1
    if N is even,
    N-1 : 2
    N-3 : 2
    1   : 1


    1 2 3 4 5 6
    1 2 3 4 5
    """
    N = read_int()
    A = read_ints()
    D = [0]*((N+1)//2)
    if N%2 == 0:
        for a in A:
            if a%2 == 0:
                return 0
            if a >= N:
                return 0
            if D[a//2] == 2:
                return 0
            D[a//2] += 1
    else:
        for a in A:
            if a%2 == 1:
                return 0
            if a >= N:
                return 0
            if D[a//2] == 2:
                return 0
            if D[0] == 2:
                return 0
            D[a//2] += 1
    return pow(2, N//2)


if __name__ == '__main__':
    print(solve())

Submission status: Accepted

Solution code:
N = int(input())
count = [0]*(N+1)
modz = 10**9 + 7

def junretsu(a):
    if a <= 0: return 1
    if (a & 0x01) == 1:
        return 2*junretsu(a-1) % modz
    else:
        rr = junretsu(a>>1)
        return rr*rr % modz

pos = list(map(int, input().split()))
for i in range(N):
    count[pos[i]] += 1

diff = [0]*(N+1)
for i in range(1, N+1):
    d = abs((N - i) - (i-1))
    diff[d] += 1

invalid = False
total = 1
for i in range(N):
    if count[i] != diff[i]:
        invalid = True
        break

if invalid:
    print(0)
else:
    print(junretsu(int(N/2)))

Submission status: Accepted

Solution code:
n = int(input())
ls = list(map(int,input().split()))
ls.sort()
if n % 2 == 0:
    if ls[::2] == ls[1::2] and ls[::2] == [e for e in range(n) if e % 2 != 0]:
        print(2**(int(n/2))%(10**9+7))
    else:
        print(0)
else:
    if ls[1::2] == ls[2::2] and ls[::2] ==  [e for e in range(n) if e % 2 == 0]:
        print(2**(int(n/2))%(10**9+7))
    else:
        print(0)

Submission status: Accepted

Solution code:
from collections import Counter


def mod_pow(a, n, mod):
    """
    二分累乗法による a^n (mod m)の実装
    :param a: 累乗の底
    :param n: 累乗の指数
    :param mod: 法
    :return: a^n (mod m)
    """

    result = 1
    a_n = a
    while n > 0:
        if n & 1:
            result = result * a_n % mod
        a_n = a_n * a_n % mod
        n >>= 1
    return result


N = int(input())
A = Counter(tuple(map(int, input().split(' '))))
MOD = 10 ** 9 + 7

if A[0] > 1:
    print(0)
elif sum([key for key, value in A.items() if value == 1]) != 0:
    print(0)
else:
    print(mod_pow(2, N // 2, MOD))

Submission status: Accepted

Solution code:
import numpy as np
import math
import sys
def sinput(): return sys.stdin.readline()
def iinput(): return int(sinput())
def imap(): return map(int, sinput().split())
def fmap(): return map(float, sinput().split())
def iarr(): return list(imap())
def farr(): return list(fmap())
def sarr(): return sinput().split()

n = int(input())
A = iarr()
s = set(A)
if sum(A)==2*sum(s): print(pow(2, len(A)//2, int(1e9+7)))
else: print(0)

Submission status: Accepted

Solution code:
import sys, re
from collections import deque, defaultdict, Counter
from math import ceil, sqrt, hypot, factorial, pi, sin, cos, tan, asin, acos, atan, radians, degrees#, log2
from itertools import accumulate, permutations, combinations, combinations_with_replacement, product, groupby
from operator import itemgetter, mul
from copy import deepcopy
from string import ascii_lowercase, ascii_uppercase, digits
from bisect import bisect, bisect_left, insort, insort_left
from fractions import gcd
from heapq import heappush, heappop
from functools import reduce
def input(): return sys.stdin.readline().strip()
def INT(): return int(input())
def MAP(): return map(int, input().split())
def LIST(): return list(map(int, input().split()))
def ZIP(n): return zip(*(MAP() for _ in range(n)))
sys.setrecursionlimit(10 ** 9)
INF = float('inf')
mod = 10**9 + 7
#from decimal import *


N = INT()
A = LIST()
A.sort()

if N%2:
	for i in range(N):
		if A[i] != -(-i//2) *2:
			print(0)
			break
	else:
		print(pow(2, N//2, mod))

else:
	for i in range(N):
		if A[i] != i//2*2 +1:
			print(0)
			break
	else:
		print(pow(2, N//2, mod))

Submission status: Accepted

Solution code:
from collections import Counter
from math import ceil

N = int(input())
A = list(map(int, input().split()))

# a position where a person could be located.
possibility = ([0 for i in range(N)])

THE_NUM = 10**9 + 7

is_exist_liar = False
# testimony
for a in A:
  # to find the number of reordering, you can only count one side.
  place_left = (N - 1 - a) // 2
  if (N - 1 - a) % 2 == 0 and place_left >= 0:
    possibility[place_left] += 1
  else:
    is_exist_liar = True
    break

answer = 1
# there is no need to count the center.
for i in range(N // 2):
  if possibility[i] <= 2:
    answer *= possibility[i]
  else:
    is_exist_liar = True
    break

# it is consistent to have more than two numbers in the middle.
if is_exist_liar or N % 2 == 1 and possibility[N//2] >= 2:
  print(0)
else:
  print(answer % THE_NUM)

Submission status: Accepted

Solution code:
n = int(input())
a = list(map(int, input().split()))
mod = (10**9)+7
w = [0]*n
for i in a:
    w[i] += 1
if (n%2==1):
    if (w[0]!=1):
        print(0)
        exit()
    for i in range(1,n):
        if (i%2==1):
            if (w[i]>0):
                print(0)
                exit()
        else:
            if (w[i]!=2):
                print(0)
                exit()
    print(pow(2,n//2,mod))
else:
    if (w[0]!=0):
        print(0)
        exit()
    for i in range(1,n):
        if (i%2==0):
            if (w[i]>0):
                print(0)
                exit()
        else:
            if (w[i]!=2):
                print(0)
                exit()
    print(pow(2,n//2,mod))

Submission status: Accepted

Solution code:
import math
N=int(input())
A=list(map(int,input().split()))
flag=True
if N%2==0:
    if 0 in A or len(set(A))!=N//2:
      flag=False
else:
    if len([0 for a in A if a==0])!=1 or len(set(A))!=N//2+1:
      flag=False
if flag:
  print(2**(N//2)%(10**9+7))
else:print(0)