// Slower C++ solution:
#include<cstdio>

#include<iostream>

#include<cstring>

using namespace std;

const int mod = 1000000007;

int num[100005];

int poss[100005];

long long PowerMod(long long a, long long b, long long c)

{

long long ans = 1;

a = a % c;

while(b>0)

{

if(b % 2 == 1)

ans = (ans * a) % c;

b = b/2;

a = (a * a) % c;

}

return ans;

}

int main()

{

    long long  n;

    memset(poss,0,sizeof(poss));

    cin>>n;

    for(int i=0;i<n;i++)

    {

        scanf("%d",&num[i]);

        poss[num[i]]++;

    }

    if(n%2==0)

    {

        for(int i=1;i<n;i+=2)

        {

            if(poss[i]!=2)

            {

                printf("0\n"); return 0;

            }

        }

        long long  k = n/2;

        cout<<PowerMod(2ll,k,mod)<<endl;

    }

    else

    {

        if(poss[0]!=1) {printf("0\n");return 0; }

        for(int i=2;i<n;i+=2)

        {



            if(poss[i]!=2)

            {

                printf("0\n"); return 0;

            }

        }

            long long  k = n/2;

            cout<<PowerMod(2ll,k,mod)<<endl;

    }

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.3789090267482238x):
#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <cmath>

#include <queue>

#include <stack>

#include <map>

#include <set>

#include <vector>

#include <iomanip>

#define ALL(x) (x).begin(), (x).end()

#define rt return

#define dll(x) scanf("%I64d",&x)

#define xll(x) printf("%I64d\n",x)

#define sz(a) int(a.size())

#define all(a) a.begin(), a.end()

#define rep(i,x,n) for(int i=x;i<n;i++)

#define repd(i,x,n) for(int i=x;i<=n;i++)

#define pii pair<int,int>

#define pll pair<long long ,long long>

#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)

#define MS0(X) memset((X), 0, sizeof((X)))

#define MSC0(X) memset((X), '\0', sizeof((X)))

#define pb push_back

#define mp make_pair

#define fi first

#define se second

#define eps 1e-6

#define gg(x) getInt(&x)

#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;

using namespace std;

typedef long long ll;

ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}

ll lcm(ll a,ll b){return a/gcd(a,b)*b;}

ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}

inline void getInt(int* p);

const int maxn=1000010;

const int inf=0x3f3f3f3f;

/*** TEMPLATE CODE * * STARTS HERE ***/

int n;

int a[maxn];

int cnt[maxn];

const ll mod=1e9+7ll;

map<int,int> b;

int main()

{

    //freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);

	//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);

	gbtb;

	cin>>n;

	repd(i,1,n)

	{

		b[(n-i)-(i-1)]=i;

	}

	repd(i,1,n)

	{

		cin>>a[i];

		cnt[b[a[i]]]++;

	}

	ll ans=1ll;

	if(n&1)

	{

		if(cnt[n/2+1]==1)

		{

			repd(i,1,n/2)

			{

				// db(cnt[b[a[i]]]);

				if(cnt[b[a[i]]]==2)

				{

					ans*=2ll;

					ans=(ans+mod)%mod;

				}else

				{

					cout<<"0"<<endl;

					return 0;

				}

			}

			cout<<ans<<endl;

		}else

		{

			cout<<"0"<<endl;

		}

	}else

	{

			repd(i,1,n/2)

			{



				if(cnt[b[a[i]]]==2)

				{

					ans*=2ll;

					ans=(ans+mod)%mod;

				}else

				{

					cout<<"0"<<endl;

					return 0;

				}

			}

			cout<<ans<<endl;

	}

	

	

	

    return 0;

}



inline void getInt(int* p) {

    char ch;

    do {

        ch = getchar();

    } while (ch == ' ' || ch == '\n');

    if (ch == '-') {

        *p = -(getchar() - '0');

        while ((ch = getchar()) >= '0' && ch <= '9') {

            *p = *p * 10 - ch + '0';

        }

    }

    else {

        *p = ch - '0';

        while ((ch = getchar()) >= '0' && ch <= '9') {

            *p = *p * 10 + ch - '0';

        }

    }

}