救民于水火

x-hechengye 2022-08-11 16:27:18 5 返回题目

#include <bits/stdc++.h>
using namespace std;
const int mo = 1e9 + 7;
int n, m, d[100][100];
int f[10001][50], g[10001][50];
int Solve() {
    for (int i = 0; i < (1 << n); i++) f[i][n] = 1;
    for (int i = 2; i <= m; i++) {
        for (int j = 0; j < (1 << n); j++)
            for (int k = 1; k <= n; k++) g[j][k] = 0;
        for (int j = 0; j < (1 << n); j++) {
            for (int k = 1; k <= n; k++) {
                if (f[j][k] == 0)
                    continue;
                for (int k2 = 0; k2 < (1 << n); k2++) {
                    bool judge = 1;
                    for (int k3 = 1; k3 < n; k3++) {
                        bool j1 = (k2 & (1 << (k3 - 1)));
                        bool j2 = (j & (1 << k3));
                        if (j1 > j2) {
                            judge = 0;
                            break;
                        }
                        if (j1 == j2 && k3 > k) {
                            judge = 0;
                            break;
                        }
                    }
                    if (!judge)
                        continue;
                    int maxv = 1;
                    for (int k3 = 1; k3 < n; k3++) {
                        bool j1 = (k2 & (1 << (k3 - 1)));
                        bool j2 = (j & (1 << k3));
                        if (j1 != j2)
                            break;
                        maxv = k3 + 1;
                        if (k3 + 1 >= k)
                            break;
                    }
                    maxv = min(maxv, k);
                    g[k2][maxv] = (g[k2][maxv] + f[j][k]) % mo;
                }
            }
        }
        for (int j = 0; j < (1 << n); j++)
            for (int k = 1; k <= n; k++) f[j][k] = g[j][k];
    }
    int ans = 0;
    for (int i = 0; i < (1 << n); i++)
        for (int j = 1; j <= n; j++) ans = (ans + f[i][j]) % mo;
    return ans;
}
int main() {
    scanf("%d%d", &n, &m);
    if (n > m)
        swap(n, m);
    if (n == 1) {
        int now = 1;
        for (int i = 1; i <= m; i++) now = now * 2 % mo;
        cout << now << endl;
        return 0;
    }
    if (n == m) {
        int ans = Solve();
        cout << ans << endl;
        return 0;
    }
    int km = m;
    m = n + 1;
    int ans = Solve();
    for (int i = n + 2; i <= km; i++) ans = (ans * 2 % mo + ans) % mo;
    cout << ans << endl;
    return 0;
}
{{ vote && vote.total.up }}