题意:

给定n个碎片的转移关系,问最多使用m个碎片组成的不同的序列个数是多少。

思路:

容易想到dp的方法,以dp[i][j]表示长度为i以j号碎片结尾的不同序列的数量。那么dp[i + 1][k] += dp[i][j](j -> k 可以转移)dp[0][0] = 1;最后的答案即为整个dp[i][j]数组所有元素的和。但是一算复杂度,超时。
于是乎想到矩阵,关系矩阵A的k次方可以求出任意长度为k+1的序列总的数量。但是这道题要求最多长度为m的总数量,也就是说要求A^0 + A^1 + A^2… + A^m - 1。如果分别用快速幂,算一算复杂度依旧超时。然后就发现了构造矩阵的神奇方法。构造的矩阵B如下:
A . . . A 1
A . . . A 1
. .. . …. A 1
. . . . A 1
A . . . A 1
0 . . . 0 1
也就是在原来的转移矩阵最右边加上一列1,用于保存上一步以及之前的总的答案,
最后的答案为矩阵B^(m-1) 的所有项的和。时间复杂度O(n^3 *log(m)),注意特判m = 1(论构造矩阵的神奇)

附搓代码:

#include <cstdio>
#include <cstring>
using namespace std;
const int piece = 55;
int ch[piece][piece];
int ans[piece][piece];
int tp[piece][piece];
int n, m;
void cal(int a[][piece], int b[][piece], int c[][piece])
{for(int i = 1; i <= n + 1; i++)for(int j = 1; j <= n + 1; j++){int tmp = 0;for(int k = 1; k <= n + 1; k++)tmp = (tmp + a[i][k] * b[k][j]) % 2015;tp[i][j] = tmp;}memcpy(c, tp, sizeof(tp));
}
void rapid(int a[][piece], int k, int b[][piece])
{for(int i = 1; i <= n + 1; i++) b[i][i] = 1;while(k){if(k & 1)cal(b, a, b);k >>= 1;cal(a, a, a);}
}
int main()
{// freopen("5411.in","r",stdin);// freopen("5411out.txt","w",stdout);int t;scanf("%d", &t);while(t--){scanf("%d%d", &n, &m);memset(ch, 0, sizeof(ch));for(int i = 1; i <= n; i++){int k;scanf("%d", &k);for(int j = 0; j < k; j++){int tmp;scanf("%d", &tmp);ch[i][tmp] = 1;}}if(m == 1)printf("%d\n", n + 1);else{memset(ans, 0, sizeof(ans));for(int i = 1; i <= n + 1; i ++)ch[i][n + 1] = 1;for(int i = 1 ; i <= n; i++)ch[n + 1][i] = 0;rapid(ch, m - 1, ans);int ls = 0;for(int i = 1; i <= n + 1; i++)for(int j = 1; j <= n + 1; j++)ls = (ls + ans[i][j]) % 2015;printf("%d\n", ls);}}
}

hdu 5411 2015多校十1006 ~矩阵快速幂相关推荐

  1. 广工十四届校赛 count 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意:求,直接矩阵快速幂得f(n)即可 构造矩阵如下: n^3是肯定得变换的,用二项式展开来一点 ...

  2. 【HDU - 4990】 Reading comprehension (构造+矩阵快速幂)

    题干: Read the program below carefully then answer the question.  #pragma comment(linker, "/STACK ...

  3. HDU 1757 A Simple Math Problem(矩阵快速幂)

    题目链接 题意 :给你m和k, 让你求f(k)%m.如果k<10,f(k) = k,否则 f(k) = a0 * f(k-1) + a1 * f(k-2) + a2 * f(k-3) + -- ...

  4. HDU - 6185 Covering(暴搜+递推+矩阵快速幂/杜教BM)

    题目链接:点击查看 题目大意:规定宽度为4,给定长度为n,求用1*2和2*1的瓷砖,将其完全铺满能有多少种方法. 分析:自从学会了矩阵快速幂之后,看到1e18的数据量都会下意识的往递推上面想,但是以前 ...

  5. 43行代码AC——HDU 1757 A Simple Math Problem(矩阵快速幂,附快速幂讲解)

    一道经典的矩阵快速幂模板题. 传送门1-->快速幂基本思想 传送门2-->矩阵快速幂讲解(教主传授) 代码(去掉空行43行) #include<iostream> #inclu ...

  6. HDU 2157 How many ways?? 临接矩阵+快速幂

    Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, ...

  7. NYOJ 300 hdu 2276 Kiki Little Kiki 2 (矩阵快速幂)

    Kiki & Little Kiki 2 时间限制:5000 ms  |  内存限制:65535 KB 难度:4 描述 There are n lights in a circle numbe ...

  8. HDU - 1757 A Simple Math Problem (矩阵快速幂)

    Lele now is thinking about a simple function f(x). If x < 10 f(x) = x.  If x >= 10 f(x) = a0 * ...

  9. 2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂

    题意:有若干字符,现在要把它们连成一个字符串,每种字符后面只能接特定种类的字符,现在询问能连接出的长度小于等于m的字符串有多少种. 思路:我们可以把这个转移关系看成一个图,如果字符a后面可以接b,那么 ...

最新文章

  1. Collections Arrays你会用么?
  2. Py之pandas:利用where、replace等函数对dataframe格式数据按照条件进行数据替换
  3. linux 下 storm环境搭建,Storm在Ubuntu环境下的单机部署
  4. c语言中执行一次的函数once,iOS只执行一次的方法
  5. C++基础02-C++对c的拓展
  6. Ethernet帧结构
  7. java abstract类和abstract方法
  8. decode函数_「实践」云函数 + API,你也可以做个天气信息系统
  9. ELK收集java日志
  10. NGN学习笔记4——软交换中的协议2—Megaco/H.248
  11. java并发编程实践之安全发布和逸出
  12. html网站页面上字体改变,如何设置网页字体样式
  13. Delphi基础教程图文版之开篇
  14. wordpress后台固定菜单消失不见了怎么办?
  15. ROS2系列知识【5】:从海龟教程开始【1】
  16. 如何查看Linux磁盘空间大小
  17. scribed 安装
  18. 帝国CMS 7.2-插件包整合
  19. 作为程序员,我到底在恐慌什么!
  20. DS18B20温度传感器 ------ 自学笔记

热门文章

  1. 构建 3D 网页新世界
  2. MFC中关闭窗口的几种方式
  3. 快速入门丨篇七:如何进行运动控制器ZCAN总线扩展模块的使用?
  4. 中国白帽黑客群像:90后占60%以上
  5. Nginx简介配置及高可用详解
  6. 【Linux】centos 7.2 max user processes修改不生效
  7. 华为BEM·第1篇:从战略方向到年度重点工作
  8. 嘉为科技荣登 :2021年福布斯中国企业科技50强
  9. Java语言基础(一)
  10. 蔚来汽车赴美上市,是自愿还是被逼的?