题目描述
方法:
状压DP
#include <cstdio>
#define bc(x) (__builtin_popcount(x))
const int mod = ;
const int maxn = ;
int f[maxn][ << maxn][maxn * maxn];
int main()
{
int n, m, p;
scanf("%d%d%d", &n, &m, &p);
for (int i = ; i < << m; ++i) f[][i][bc(i)] = ;
for (int i = ; i <= n; ++i)
{
for (int j = ; j < << m; ++j)
{
for (int k = ; k < << m; ++k)
{
if ((j << ) & k) continue;
if (j & (k << )) continue;
for (int l = p; l >= bc(k); --l) f[i][k][l] = (f[i][k][l] + f[i - ][j][l - bc(k)]) % mod;
}
}
}
static int ans;
for (int i = ; i < << m; ++i) ans = (ans + f[n][i][p]) % mod;
printf("%d\n", ans);
return ;
}