正题
题目大意
一个2∗n2*n2∗n的矩形,求分歌成k块的方案数。
解题思路
我们用fi,j,0/1f_{i,j,0/1}fi,j,0/1表示前i列,分成j块,第i列是相同一块还是分开的一块。
然后我们分析
(不同颜色表示不同联通块)(字型体汇)
然后推出方程
(f[i][j][0]+=f[i-1][j-2][0])%=mod;(f[i][j][0]+=f[i-1][j-2][1])%=mod;(f[i][j][0]+=f[i-1][j-1][0]*2)%=mod;(f[i][j][0]+=f[i-1][j-1][1]*2)%=mod;(f[i][j][0]+=f[i-1][j][0])%=mod;(f[i][j][1]+=f[i-1][j-1][0])%=mod;(f[i][j][1]+=f[i-1][j-1][1])%=mod;(f[i][j][1]+=f[i-1][j][0]*2)%=mod;(f[i][j][1]+=f[i-1][j][1])%=mod;
code
#include<cstdio>
#include<algorithm>
#define mod 100000007
#define ll long long
using namespace std;
ll n,k,f[2001][2001][2];
int main()
{scanf("%lld%lld",&n,&k);f[1][2][0]=f[1][1][1]=1;for(ll i=2;i<=n;i++)for(ll j=1;j<=min((i<<1),k);j++){(f[i][j][0]+=f[i-1][j-2][0])%=mod;(f[i][j][0]+=f[i-1][j-2][1])%=mod;(f[i][j][0]+=f[i-1][j-1][0]*2)%=mod;(f[i][j][0]+=f[i-1][j-1][1]*2)%=mod;(f[i][j][0]+=f[i-1][j][0])%=mod;(f[i][j][1]+=f[i-1][j-1][0])%=mod;(f[i][j][1]+=f[i-1][j-1][1])%=mod;(f[i][j][1]+=f[i-1][j][0]*2)%=mod;(f[i][j][1]+=f[i-1][j][1])%=mod;}printf("%lld",(f[n][k][0]+f[n][k][1])%mod);
}