
Codeforces301E 题解
题意:
- 给出 n,m,k,询问有多少个长度为 n 的数组 b 满足以下要求:
- b[i]≤b[i+1],1≤i<n
- 1≤b[1]≤b[n]≤m
- 将 b 数组排列后有大于等于一种小于等于 k 种排列 a 满足以下要求:
- |a[i]−a[i+1]|=1(1≤i<n)
- |a[n]−a[1]|=1
- a[1]=minni=1a[i]
- n,m,k≤100
题解:
- 首先我们可以假设 a[1]=1,最后将答案乘上 m−i+1 即可。
- 不妨破环成链,设 a[n+1]=a[1]。
- 设 dp[i][j][k][l] 表示目前最大数为 i,已经有 j 个数,有 k 个空必须加数,满足的排列数已有 l 种的方案数。
- 转移比较显然:
- 枚举 i+1 的个数 t。
- dp[i][j][k][l]−>dp[i+1][j+t][t−k][l∗Ck−1t−1]
- 注意,只有一个数显然是不可以的(因为我们开始已经让 n 加一了)。
No Comments