我们转变思路,考虑给出一个循环判断它是否合法。如果这个循环里没有
1
,显然合法。如果有一个
先考虑安排
再考虑把
2
加入,每个加入的
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
const int maxn=1000010,p=1000000007;
int n,m,dp[maxn];
int main()
{
int x,ans;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
if (x==1) m++;
}
dp[0]=dp[1]=1;
for (int i=2;i<=m;i++)
dp[i]=(dp[i-1]+(LL)dp[i-2]*(i-1))%p;
ans=dp[m];
for (int i=m+1;i<=n;i++) ans=(LL)ans*i%p;
printf("%d\n",ans);
}