#include <iostream>

using namespace std;

int mod = 1000000007;

int boje[504];
int korenje[504];
int block[504];
int kp=0;
int c=0;
int bojakorenja=0;
int N;

bool rootinrange(int l,int h);
int PostaviZvezde(int l,int d);
int PostaviList(int s,int p,int e,int z,int l,int d);

bool rootinrange(int l, int h)
{
    bool acc=false;
    if(h>N-1)
    {
        return rootinrange(l,N-1) || rootinrange(0,h%N);
    }
    else
    {
        for(int i=l;i<=h;i++)
        {
            acc=acc||(bojakorenja==boje[i]);
        }
        return acc;
    }
}

int PostaviZvezde(int l,int d)
{
    int p=0;
//    cout<<"postavi zvezdu "<<p<<endl;
    if((d-l)==0){return 1;}
    for(int i=l;i<d;i++)
    {
        if(boje[i]==bojakorenja){p=i;break;}
    }
    block[korenje[p]]=1;
    int res=PostaviList(korenje[p]+1,3,korenje[p]-1+N,p,l,d);
    block[korenje[p]]=0;
    return res%mod;
}

int PostaviList(int s,int p,int e,int z,int l,int d)
{
    int res=0;
    if(p==0){return 0;}
    else
    {
        for(int i=s;i<=e;i+=4)
        {
            if(boje[i%N]!=bojakorenja)
            {
                if(i==s && block[i%N]==0 && i%N>=l && i%N<=d){/*cout<<p<<" "<<i<<endl;*/block[i%N]=1;PostaviList(i+1,p-1,e,z,l,d);res+=PostaviZvezde(s,i);block[i%N]=0;}
                else if(rootinrange(s,i) && block[i%N]==0 && i%N>=l && i%N<=d){/*cout<<p<<" "<<i<<endl;*/block[i%N]=1;PostaviList(i+1,p-1,e,z,l,d);res+=PostaviZvezde(s,i);block[i%N]=0;}
            }
        }
    }
    return res%mod;
}

int Zvezda(int nt, int* A) {
    N=nt;
    for(int i=0;i<N;i++)
    {
        boje[i]=A[i+1];
        c+=A[i+1];
    }
    if(c==(N/4)){bojakorenja=1;}
    for(int i=0;i<N;i++)
    {
        if(boje[i]==bojakorenja){korenje[kp]=i;kp++;}
    }
    return PostaviZvezde(0,N);
}