Description
Input
Output
Sample Input
4 2 1 1 2
Sample Output
2
Data Constraint
题解
- 设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 }