//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)