//MADE BY Y_is_sunshine;
//#include <bits/stdc++.h>
//#include <memory.h>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define INF 0x3f3f3f3f
#define MAXN 1024
const int mod = 1e9 + 7;
const double PI = acos(-1);
using namespace std;
int king[MAXN];
int state[MAXN];
long long dp[15][1024][105];
int N, M;
int cnt;
void init(void) {
int tot = (1 << N) - 1;
for (int i = 0; i <= tot; i++) {
if (!((i << 1) & i)) {
state[++cnt] = i;
int temp = i;
while (temp) {
king[cnt] += temp & 1;
temp >>= 1;
}
}
}
}
int main(void)
{
freopen("data.txt", "r", stdin);
ios::sync_with_stdio(false);
//cin.tie(nullptr);
cin.tie(NULL);
cin >> N >> M;
init();
for (int i = 1; i <= cnt; i++)
if (king[i] <= M)
dp[1][i][king[i]] = 1;
for (int i = 2; i <= N; i++) {
for (int j = 1; j <= cnt; j++) {
for (int k = 1; k <= cnt; k++) {
if (state[j] & state[k]) continue;
if ((state[j] << 1) & state[k]) continue;
if (state[j] & (state[k] << 1)) continue;
for (int o = max(1, king[j]); o + king[k] <= M; o++) {
dp[i][k][o + king[k]] += dp[i - 1][j][o];
}
}
}
}
long long ans = 0;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= cnt; j++)
ans += dp[i][j][M];
cout << ans << endl;
freopen("CON", "r", stdin);
system("pause");
return 0;
}
//MADE BY Y_is_sunshine;
//#include <bits/stdc++.h>
//#include <memory.h>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define INF 0x3f3f3f3f
#define MAXN 1024
const int mod = 1e9 + 7;
const double PI = acos(-1);
using namespace std;
int king[MAXN];
int state[MAXN];
long long dp[15][1024][105];
int N, M;
int cnt;
void init(void) {
int tot = (1 << N) - 1;
for (int i = 0; i <= tot; i++) {
if (!((i << 1) & i)) {
state[++cnt] = i;
int temp = i;
while (temp) {
king[cnt] += temp & 1;
temp >>= 1;
}
}
}
}
int main(void)
{
freopen("data.txt", "r", stdin);
ios::sync_with_stdio(false);
//cin.tie(nullptr);
cin.tie(NULL);
cin >> N >> M;
init();
for (int i = 1; i <= cnt; i++)
if (king[i] <= M)
dp[1][i][king[i]] = 1;
for (int i = 2; i <= N; i++) {
for (int j = 1; j <= cnt; j++) {
for (int k = 1; k <= cnt; k++) {
if (state[j] & state[k]) continue;
if ((state[j] << 1) & state[k]) continue;
if (state[j] & (state[k] << 1)) continue;
/*for (int o = max(1, king[j]); o + king[k] <= M; o++) {
dp[i][k][o + king[k]] += dp[i - 1][j][o];
}*/
for (int o = king[j]; o + king[k] <= M; o++) {
dp[i][k][o + king[k]] += dp[i - 1][j][o];
}
}
}
}
long long ans = 0;
/*for (int i = 1; i <= N; i++) {
for (int j = 1; j <= cnt; j++) {
for (int k = 0; k <= M; k++)
cout << dp[i][j][k] << " ";
putchar(10);
}
putchar(10);
}*/
for (int i = 1; i <= cnt; i++)
ans += dp[N][i][M];
cout << ans << endl;
freopen("CON", "r", stdin);
system("pause");
return 0;
} 两种写法 第一种没有转移0这种情况 第二种转移0
[洛谷P](https://www.luogu.org/problem/P1896)