传送门

此题是一个很好的题目,可以加深对矩阵快速幂的理解。若对基本的矩阵快速幂不太理解,需要先了解一下简单的比较裸一点的题目后再看本题目,更有利于理解。可以先学习一下 HDU_2842。本人写过这道题目的题解,但是并不详细,仅供参考我的题解HUD2842。

Solution

参考题解1
参考题解2

  1. 假设:长度m的花圃所有的状态为 [0,S],S=2m−1[0, S], S = 2^m - 1[0,S],S=2m−1。 状态1表示C形花圃,0表示P形花圃
  2. 我们假设花园为链状的,则:状态转移方程为
ll t1=j>>1,t2=(j>>1)|(1<<(m-1));
if(num_1(t2)<=k)//1的个数小于等于kf[i][j]=f[i-1][t1]+f[i-1][t2];
elsef[i][j]=f[i-1][t1];
  1. 由于是环形的,我只需要由某种长度为m的合法状态的花园进行状态转移n次,然后保证最后一次的状态与初始状态相同即可。
  2. 假设状态转移矩阵 X 中某个点a[i, j] = 1,表示状态 i 可由状态 j 转移 过来。
    现在假设 [0,S][0, S][0,S]中每一个合法状态的矩阵为 A
    (000i0...0)\begin{pmatrix} 0\\0\\0\\i\\0\\...\\0 \end{pmatrix}⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛​000i0...0​⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞​
    此矩阵共S + 1 行,i∈[0,S]i\in[0, S]i∈[0,S],表示某一种长度为m的状态为i的花园。
    设 F=Xn×AF = X ^ n \times AF=Xn×A。显然,F 为 1×(S+1)1 \times (S + 1)1×(S+1) 的矩阵。
    则此种情况下的方案数为 F[i]F[i]F[i]。
    由此,我只需要分别求出所有状态的F矩阵然后求和即可。

但是,有一种更为简便的方法:
5. P=XnP = X ^ nP=Xn , ans=∑i=0SP[i][i],i为合法状态ans = \sum^S_{i = 0} P[i][i], i为合法状态ans=∑i=0S​P[i][i],i为合法状态。
6. 仔细思考后发现,其实就是把所有的合法方案放在一个 (S+1)×(S+1)(S + 1) \times (S + 1)(S+1)×(S+1)的矩阵M中,第i 行为 状态为 i 的 1×(S+1)1 \times (S + 1)1×(S+1)的矩阵
(也可看做单位矩阵,只不过最后求和只加上合法的方案即可, 即 P=Xn×EP = X^n \times EP=Xn×E。)。
8. 然后对于每行中的状态 i 其结果 自然是 第 i 列的末状态(由于是原型花园嘛,得保证初始状态和最终的状态相同)。所以最终的答案就是 P 矩阵的斜对角线了。

Code

#define mt(a,b) memset(a, b, sizeof a)
#define ll long long int
const ll mod = 1000000007;
using namespace std;
const int N = (1 << 5) + 5;
ll n;
int m, k, S;
int ok[N];//合法状态//矩阵
struct matrix
{ll a[N][N];matrix() { mt(a, 0); }matrix operator * (const matrix x) const{matrix ans;for (int i = 0; i <= S; i++)for (int j = 0; j <= S; j++)for (int k = 0; k <= S; k++)ans.a[i][j] = (ans.a[i][j] + x.a[i][k] * a[k][j]) % mod;//?return ans;}
};ll power(ll n)
{matrix e, dp;for (int i = 0; i <= S; i++)//单位矩阵初始化e.a[i][i] = 1;for (int i = 0; i <= S; i++)// 求转移矩阵if (ok[i]){int t1 = i >> 1;int t2 = t1 | 1 << (m - 1);dp.a[i][t1] = 1;if (ok[t2])dp.a[i][t2] = 1;}for (; n; n >>= 1){if (n & 1) e = e * dp;dp = dp * dp;}ll ans = 0;for (int i = 0; i <= S; i++)if (ok[i])ans = (ans + e.a[i][i]) % mod;return ans;
}int main()
{cin >> n >> m >> k;S = (1 << m) - 1;//状态for (int i = 0; i <= S; i++){int cnt = 0, x = i;while (x) x -= x & -x, cnt++;if (cnt <= k) ok[i] = 1;}cout << power(n) << endl;return 0;
}

P1357 花园(状压dp + 矩阵快速幂)相关推荐

  1. 第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs

    http://nyoj.top/problem/1273 状压dp+矩阵快速幂+dfs 1273-宣传墙 内存限制:64MB 时间限制:1000ms 特判: No 通过数:19 提交数:64 难度:4 ...

  2. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  3. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  4. 2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)

    传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后 ...

  5. Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】

    题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...

  6. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  7. nyoj1273 河南省第九届省赛_宣传墙、状压DP+矩阵幂加速

    宣传墙 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...

  8. bzoj 3329: Xorequ(DP+矩阵快速幂)

    3329: Xorequ Time Limit: 1 Sec  Memory Limit: 256 MB Submit: 1134  Solved: 491 [Submit][Status][Disc ...

  9. bzoj 4818: [Sdoi2017]序列计数(DP+矩阵快速幂)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 769  Solved: 463 [Submit][Stat ...

  10. 骨牌问题(DP+矩阵快速幂)

    在2*N的一个长方形方格中,用一个1*2的骨牌排满方格. 问有多少种不同的排列方法. 例如:2 * 3的方格,共有3种不同的排法.(由于方案的数量巨大,只输出 Mod 10^9 + 7 的结果) In ...

最新文章

  1. 2097352GB地图数据,AI技术酷炫渲染,《微软飞行模拟器》游戏即将上线
  2. 周长相等的正方形面积一定相等_习题创编——周长相等的长方形面积(20200108)...
  3. sudo: unable to resolve host ubuntu提示的解决
  4. poj3648 2-sat 输出任意一组解
  5. table row设置cell的html,css中display设置为table、table-row、table-cell后的作用及其注意点...
  6. 城市运行一网统管_全国率先!“一屏观天下、一网管全城”,临港城市运行“一网统管”平台启动建设...
  7. 深度学习制作数据集的部分代码实现(解压zip、生成json文件)
  8. Java自动化测试框架-04 - TestNG之Test Method篇 - (详细教程)
  9. set.contains()分析
  10. 【Luogu2142】【模板】高精度减法
  11. 找不到所需的 Adobe Flash Player 调试器版本
  12. 【通信原理 入坑之路】 —— 深入理解BPSK调制和解调的全过程及其Matlab实现
  13. 在校大学生如何申请免费教育版 Intellij IDEA
  14. python UI自动化自动关闭浏览器学习记录
  15. Retrofit 框架详解和使用
  16. [secureCRT] session log保存 并添加时间戳
  17. U盘名从E:/变成F:/,怎么修改回来
  18. 四个方面讲解MPK(安规电容)与CBB电容的区别
  19. 攻防世界MISC进阶之misc1
  20. MySql查询本周或下周过生日的人

热门文章

  1. Xilinx BFM仿真过程中遇到的问题
  2. PON串口链接详细步骤说明
  3. PAT甲级 A1099
  4. 7天快速掌握MySQL-DAY2
  5. php多级分栏,网页设计中分栏布局的几种实现方案
  6. Python 截屏 - lone112 - 博客园
  7. 小米怎么解锁,有什么相关教程
  8. 〖Python〗-- Django基础
  9. MAC M1安装VMware 安装windows11
  10. 全基因组关联分析学习资料(GWAS tutorial)20210313更新版