分析:
k很小,可以状压。
f[S][i]表示状态S表示在i之前k+1个中点的边数奇偶情况
之后转移的时候,S的最后一位不能为1
附上代码:
#include <cstdio> #include <algorithm> #include <cmath> #include <cstdlib> #include <cstring> #include <queue> #include <iostream> using namespace std; #define N 35 #define mod 1000000007 #define M 1<<9 int f[N][N][M][10],num,n,m,k; int main() { scanf("%d%d%d",&n,&m,&k); f[1][0][0][0]=1; for(int i=1;i<n;i++) { for(int j=0;j<=m;j++) { for(int S=0;S<1<<(k+1);S++) { for(int l=0;l<k;l++) { if(!f[i][j][S][l])continue; f[i][j][S][l+1]=(f[i][j][S][l+1]+f[i][j][S][l])%mod; if(j<m&&i-k+1+l>=1) { (f[i][j+1][S^(1<<k)^(1<<l)][l]+=f[i][j][S][l])%=mod; } if(!(S&1)) { (f[i+1][j][S>>1][0]+=f[i][j][S][k])%=mod; } } } } } printf("%d ",f[n][m][0][0]); return 0; }