救民于水火
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 }}