【矩阵快速幂】 HDOJ 5434 Peace small elephant

来源:互联网 发布:零基础学云计算 编辑:程序博客网 时间:2024/06/07 08:30

对每一列状态压缩,然后矩阵加速即可。。。

#include <bits/stdc++.h>using namespace std;typedef long long LL;const int mod = 1e9+7;const int maxn = 130;LL mat[maxn][maxn];LL mid[maxn][maxn];LL res[maxn][maxn];int n, m;void calc(int b){int N = 1 << m;memset(res, 0, sizeof res);for(int i = 0; i < N; i++) res[i][i] = 1;while(b) {if(b % 2) {for(int i = 0; i < N; i++)for(int j = 0; j < N; j++) {LL t = 0;for(int k = 0; k < N; k++)t = (t + res[i][k] * mat[k][j]) % mod;mid[i][j] = t;}memcpy(res, mid, sizeof res);}for(int i = 0; i < N; i++)for(int j = 0; j < N; j++) {LL t = 0;for(int k = 0; k < N; k++)t = (t + mat[i][k] * mat[k][j]) % mod;mid[i][j] = t;}memcpy(mat, mid, sizeof mat);b /= 2;}}bool check(int a, int b){for(int i = 0; i < m; i++) {if((1 << i) & b) {if(i) {if(((1 << i-1) & a) && ((1 << i-1) & b) == 0 && ((1 << i) & a) == 0)return 0;}if(i+1 < m) {if(((1 << i+1) & a) && ((1 << i+1) & b) == 0 && ((1 << i) & a) == 0)return 0;}}}return 1;}void work(){memset(mat, 0, sizeof mat);for(int i = 0; i < 1 << m; i++)for(int j = 0; j < 1 << m; j++)mat[i][j] = check(i, j);calc(n);LL ans = 0;for(int i = 0; i < 1 << m; i++) ans = (ans + res[0][i]) % mod;printf("%lld\n", ans);}int main(){while(scanf("%d%d", &n, &m) != EOF) {work();}return 0;}


0 0
原创粉丝点击