Start: Feb, 20, 2019 12:00:00
2018-2019 ACM集训队冬季集训第一次考核
End: Feb, 20, 2019 17:00:00
Time elapsed:
Time remaining:

Problem_ID: A
Result: Accepted
Time: 6ms
Memory: 1716kB
Author: 2017212212208
In contest: 1260

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int inf = 0x3f3f3f3f;
#define LL long long 
long long  gcd(long long  a, long long  b) { return a == 0 ? b : gcd(b % a, a); }


int n;
int N[50];
char s[100];
LL ans=0;
LL mul[50];
int u[5];
const LL mode=1e9+7;
void DFS(int ty,int nx)
{
	//printf("%d\n",nx);
	if(nx==n)
	{
		ans+=mul[N[1]]*mul[N[2]]*mul[N[3]];
		ans%=mode;
		return ;
	}
	if(ty==1)
	{
		if(s[nx]=='0')
		{
			u[1]++;
			if(u[1]<=N[1])DFS(1,nx+1);
			u[1]--;

			u[2]++;
			if(u[2]<=N[2])DFS(2,nx+1);
			u[2]--;
		}
		else
		{
			u[3]++;
			if(u[3]<=N[3])DFS(3,nx+1);
			u[3]--;
		}
	}
	else if(ty==2)
	{
		if(s[nx]=='0')
		{
			u[1]++;
			if(u[1]<=N[1])DFS(1,nx+1);
			u[1]--;

			u[2]++;
			if(u[2]<=N[2])DFS(2,nx+1);
			u[2]--;

			u[3]++;
			if(u[3]<=N[3])DFS(3,nx+1);
			u[3]--;
		}
	}
	else
	{
		if(s[nx]=='0')
		{
			u[3]++;
			if(u[3]<=N[3])DFS(3,nx+1);
			u[3]--;

			u[2]++;
			if(u[2]<=N[2])DFS(2,nx+1);
			u[2]--;
		}
		else
		{
			u[1]++;
			if(u[1]<=N[1])DFS(1,nx+1);
			u[1]--;
		}
	}

	return ;
}
int main()
{
	mul[0]=1;
	for(int i=1;i<=20;i++)mul[i]=mul[i-1]*i,N[i]=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		N[x]++;
	}
	scanf("%s",s+1);
	memset(u,0,sizeof(u));
	for(int i=1;i<=3;i++)
	{
		u[i]++;
		if(u[i]<=N[i])DFS(i,1);
		u[i]--;
	}
	printf("%lld\n",ans);

}