题意:一个只含字母C和P的环形串

   求长度为n且每m个连续字符不含有超过k个C的方案数

   m <= 5  n <= 1e15

题解:用一个m位二进制表示状态 转移很好想

   但是这个题是用矩阵快速幂加速dp的 因为每一位的转移都是一样的

   用一个矩阵表示状态i能否转移到状态j 然后跑一遍

   统计答案特别讲究 因为是一个环 从1 ~ n+m

   那么 m+1 ~ n + m之间就是我们所求的 1 ~ m和n+1 ~ n + m是同样的一段

   就相当于把m位二进制状态 转移n次

   然后再转移到自己的就是答案

   初试模板题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;ll n, m, k, len;
struct node {ll c[64][64];
}re, x;bool check(int x) {int cnt = 0;while(x) {if(x & 1) cnt++;x >>= 1;}if(cnt > k) return false;return true;
}node mul(node a, node b) {node res;memset(res.c, 0, sizeof(res.c));for(int i = 0; i < len; i++)for(int j = 0; j < len; j++)for(int k = 0; k < len; k++)res.c[i][j] = (res.c[i][j] + a.c[i][k] * b.c[k][j] % mod) % mod;return res;
}node pow_mod(node x, ll y) {node res;for(int i = 0; i < len; i++) res.c[i][i] = 1;while(y) {if(y & 1) res = mul(res, x);x = mul(x, x);y >>= 1;}return res;
}int main() {scanf("%lld%lld%lld", &n, &m, &k);len = (1 << m);for(int i = 0; i < len; i++)for(int j = 0; j < len; j++)x.c[i][j] = 0;for(int i = 0; i < len; i++) {if(!check(i)) continue;int tmp = i;int ctmp = 1 << (m - 1);if((tmp & ctmp) == ctmp) tmp -= ctmp;tmp <<= 1;if(check(tmp)) x.c[i][tmp] = 1;tmp |= 1;if(check(tmp)) x.c[i][tmp] = 1;}re = pow_mod(x, n);ll ans = 0;for(int i = 0; i < len; i++) {if(check(i)) {ans += re.c[i][i];ans %= mod;}}printf("%lld\n", ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/lwqq3/p/11080597.html

P1357 花园 (矩阵快速幂+ DP)相关推荐

  1. [选拔赛1]花园(矩阵快速幂),JM的月亮神树(最短路),保护出题人(斜率优化)

    多年不考试,一夜回到解放前 T1:花园 title solution code T2:月亮神树 title solution code T3:保护出题人 title solution code T1: ...

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

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

  3. 2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 分组(矩阵快速幂套NTT优化dp)

    题目链接:点击查看 题目大意:给出 nnn 个连续的小球,每次可以选择单独的一个或者相邻的两个小球分成一组,允许有剩余的小球,问恰好分成 k∈{1,2,3,⋯,m}k\in\{1,2,3,\cdots ...

  4. 2021HDU多校8 - 7057 Buying Snacks(矩阵快速幂套NTT优化dp)

    题目链接:点击查看 题目大意:给出 nnn 种糖果,每种糖果有大小包装之分,有三种购买方案,价钱分别如下: 单独购买一个小的,花费一块钱 单独购买一个大的,花费两块钱 ∀i>1\forall i ...

  5. 【POJ - 3744】Scout YYF I(概率dp,矩阵快速幂优化dp)

    题干: 题目大意: 在一条不满地雷的路上(无限长),你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的可能坐标范围:[1,100000000]. 每次前进p的概率前进一步, ...

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

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

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

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

  8. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

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

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

最新文章

  1. 5G和AI机器人平台
  2. ADC动态范围的计算
  3. 表单form类型数据转换为数组array
  4. (8) Xamarin使用Jar檔
  5. golang MySQL 占内存_golang操作mysql使用总结
  6. 亲身经历揭露淘宝上主板交换的陷阱
  7. 字符串的比较相关方法
  8. C数据类型之基本类型
  9. 红石32位cpu通用计算机,我的世界无命令方块32位红石电脑装置详解
  10. python开发信息系统权限设置_利用Python实现权限设置的详细教程
  11. python 扫描枪_python 之serial、pyusb 使用开发
  12. 历史首次!中国联通、中国电信组队了,只为达成这个目的
  13. 折半枚举(双向搜索)
  14. A加载B,B发生的变化
  15. 配置csrf_django 入门第一课 配置文件
  16. 浅析 C++智能指针和 enable_shared_from_this 机制
  17. html比赛项目,趣味运动会项目
  18. 网络流(4)——带有容量的顶点和二部匹配
  19. Jaspersoft Studio 创建简单报表
  20. 小程序发布线上接口请求失败,开发者工具请求正常,体验版和开发版要打开调试才可以正常请求解决办法

热门文章

  1. 兰州财经大学JAVA期末考什么_兰州财经大学大学国文下答案
  2. php7性能原理,php7卓越性能背后的原理有哪些?
  3. rocketmq 消费方式_RocketMQ事务消费和顺序消费详解
  4. 存储过程 not supported yet_让我们来看看+Redis如何存储和计算一亿用户的活跃度
  5. 5折交叉验证_数据集的划分——交叉验证法
  6. 软件工程电商系统数据库定义_某个电子商务系统项目的数据库设计
  7. 为什么需要StringBuffer
  8. 汇编程序基本原理知识笔记
  9. 2019 Vue开发指南:你都需要学点啥?
  10. Ubuntu18.04的vim和ifconfig的安装