题解
- 设f[i][j]为剩下i个1,j个2的地图数量
- 如果2号用了一条边就是1号点了
- 根据情况dp
代码
1 #include <cstdio>
2 using namespace std;
3 int n,num[3],f[2010][2010],mo=998244353;
4 int main()
5 {
6 freopen("map.in","r",stdin);freopen("map.out","w",stdout);
7 scanf("%d",&n);
8 for (int x,i=1;i<=n;i++) scanf("%d",&x),num[x]++;
9 f[0][0]=1;
10 for (int i=0;i<=n;i++)
11 for (int x=i;x>=0;x--)
12 {
13 int y=i-x;
14 if (x>=1&&y==0) (f[x+1][y]+=1ll*f[x-1][y]*x%mo)%=mo;
15 if (x>=2) (f[x][y+1]+=1ll*f[x-2][y]*((1ll*x*(x-1)/2)%mo)%mo)%=mo;
16 if (y>=2) (f[x][y+1]+=1ll*f[x+2][y-2]*((1ll*y*(y-1)/2)%mo)%mo)%=mo;
17 if (i*x) (f[x][y+1]+=1ll*f[x][y-1]*x%mo*y%mo)%=mo;
18 }
19 printf("%d",f[num[1]][num[2]]);
20 }