Dp 神奇的状态转移……
Program fd; const mo=1000000007; var n,i,j:longint; c,tot:array[1..15] of longint; f:array[0..15,0..15,0..15,0..15,0..15,0..15] of int64; function dfs(a1,a2,a3,a4,a5,last:longint):int64; var i,j:longint; ans,q:int64; a:array[1..5] of longint; begin if f[a1,a2,a3,a4,a5,last]>0 then exit(f[a1,a2,a3,a4,a5,last]); a[1]:=a1;a[2]:=a2;a[3]:=a3;a[4]:=a4;a[5]:=a5; ans:=0; for i:=1 to 5 do if (a[i]>0) then begin if (last=i+1) and (a[i]=1) then continue; // if (last=i+1) then dec(a[i]); dec(a[i]); if i>1 then inc(a[i-1]); q:=dfs(a[1],a[2],a[3],a[4],a[5],i); inc(a[i]); if i>1 then dec(a[i-1]); if last=i+1 then ans:=(ans+(a[i]-1)*q) mod mo else ans:=(ans+a[i]*q) mod mo; // if (last=i+1) then inc(a[i]); end; f[a1,a2,a3,a4,a5,last]:=ans; exit(ans); end; begin read(n); fillchar(tot,sizeof(tot),0); for i:=1 to n do begin read(c[i]); inc(tot[c[i]]); end; fillchar(f,sizeof(f),0); for i:=1 to n do f[0,0,0,0,0,i]:=1; writeln(dfs(tot[1],tot[2],tot[3],tot[4],tot[5],0)); end.