题解:CF268D Wall Bars
题意
将题目抽象成这个问题:构造一个由
Solution
考虑指定
上下两种转移分别表示新加的数是不是
然而这并不完善,因为我们考虑
求
最终复杂度
Code
#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define ll long long
using namespace std;
const int N = 1005,M = 1000000009;
int n,h;
ll f[N][35],ans,g[2][35][35],p[2][35][35][35],q[2][35][35][35][35];
inline void amod(ll &a)
{
if (a > M) a -= M;
}
inline void aamod(ll &a)
{
while (a > M) a -= M;
}
signed main()
{
ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n >> h;
f[0][0] = 1;
for (int i = 0; i < n; i++)
for (int j = 0; j < h; j++)
{
f[i+1][0] += f[i][j],f[i+1][j+1] += f[i][j]*3;
amod(f[i+1][0]),aamod(f[i+1][j+1]);
}
g[0][0][0] = 1;
int nowg = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= h; j++)
for (int k = 0; k <= h; k++)
g[nowg^1][j][k] = 0;
for (int j = 0; j < h; j++)
for (int k = 0; k < h; k++)
{
g[nowg^1][j+1][0] += g[nowg][j][k];
g[nowg^1][0][k+1] += g[nowg][j][k];
g[nowg^1][j+1][k+1] += g[nowg][j][k]*2;
amod(g[nowg^1][j+1][0]);
amod(g[nowg^1][0][k+1]);
aamod(g[nowg^1][j+1][k+1]);
}
nowg ^= 1;
int cnt = 0;
for (int j = 0; j < h; j++)
for (int k = 0; k < h; k++)
cnt += g[nowg][j][k];
}
p[0][0][0][0] = 1;
nowg = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < h; j++)
for (int k = 0; k < h; k++)
for (int l = 0; l < h; l++)
p[nowg^1][j][k][l] = 0;
for (int j = 0; j < h; j++)
for (int k = 0; k < h; k++)
for (int l = 0; l < h; l++)
{
p[nowg^1][0][k+1][l+1] += p[nowg][j][k][l];
p[nowg^1][j+1][0][l+1] += p[nowg][j][k][l];
p[nowg^1][j+1][k+1][0] += p[nowg][j][k][l];
p[nowg^1][j+1][k+1][l+1] += p[nowg][j][k][l];
amod(p[nowg^1][0][k+1][l+1]);
amod(p[nowg^1][j+1][0][l+1]);
amod(p[nowg^1][j+1][k+1][0]);
amod(p[nowg^1][j+1][k+1][l+1]);
}
nowg ^= 1;
}
q[0][0][0][0][0] = 1;
nowg = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < h; j++)
for (int k = 0; k < h; k++)
for (int l = 0; l < h; l++)
for (int u = 0; u < (!l||!j||!k?h:1); u++)
q[nowg^1][j][k][l][u] = 0,aamod(q[nowg][j][k][l][u]);
for (int j = 0; j < h; j++)
for (int k = 0; k < h; k++)
for (int l = 0; l < h; l++)
{
for (int u = 0; u < (!l||!j||!k?h:1); u++)
{
if (!q[nowg][j][k][l][u]) continue;
q[nowg^1][0][k+1][l+1][u+1] += q[nowg][j][k][l][u];
q[nowg^1][j+1][0][l+1][u+1] += q[nowg][j][k][l][u];
q[nowg^1][j+1][k+1][0][u+1] += q[nowg][j][k][l][u];
q[nowg^1][j+1][k+1][l+1][0] += q[nowg][j][k][l][u];
}
}
nowg ^= 1;
}
for (int i = 0; i < h; i++)
{
ans += f[n][i];
amod(ans);
}
ans = ans*4%M;
ll num = 0;
for (int i = 0; i < h; i++)
for (int j = 0; j < h; j++)
{
num += g[nowg][i][j];
amod(num);
}
ans = (ans-num*6%M+M)%M;
num = 0;
for (int j = 0; j < h; j++)
for (int k = 0; k < h; k++)
for (int l = 0; l < h; l++)
{
num += p[nowg][j][k][l];
amod(num);
}
ans = (ans+num*4)%M;
num = 0;
for (int j = 0; j < h; j++)
for (int k = 0; k < h; k++)
for (int l = 0; l < h; l++)
for (int u = 0; u < (!l||!j||!k?h:1); u++)
{
num += q[nowg][j][k][l][u];
aamod(num);
}
ans = (ans-num+M)%M;
cout << ans;
return 0;
}