hdu 5411 2015多校十1006 ~矩阵快速幂
题意:
给定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 ~矩阵快速幂相关推荐
- 广工十四届校赛 count 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意:求,直接矩阵快速幂得f(n)即可 构造矩阵如下: n^3是肯定得变换的,用二项式展开来一点 ...
- 【HDU - 4990】 Reading comprehension (构造+矩阵快速幂)
题干: Read the program below carefully then answer the question. #pragma comment(linker, "/STACK ...
- 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) + -- ...
- HDU - 6185 Covering(暴搜+递推+矩阵快速幂/杜教BM)
题目链接:点击查看 题目大意:规定宽度为4,给定长度为n,求用1*2和2*1的瓷砖,将其完全铺满能有多少种方法. 分析:自从学会了矩阵快速幂之后,看到1e18的数据量都会下意识的往递推上面想,但是以前 ...
- 43行代码AC——HDU 1757 A Simple Math Problem(矩阵快速幂,附快速幂讲解)
一道经典的矩阵快速幂模板题. 传送门1-->快速幂基本思想 传送门2-->矩阵快速幂讲解(教主传授) 代码(去掉空行43行) #include<iostream> #inclu ...
- HDU 2157 How many ways?? 临接矩阵+快速幂
Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, ...
- 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 ...
- 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 * ...
- 2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂
题意:有若干字符,现在要把它们连成一个字符串,每种字符后面只能接特定种类的字符,现在询问能连接出的长度小于等于m的字符串有多少种. 思路:我们可以把这个转移关系看成一个图,如果字符a后面可以接b,那么 ...
最新文章
- Collections Arrays你会用么?
- Py之pandas:利用where、replace等函数对dataframe格式数据按照条件进行数据替换
- linux 下 storm环境搭建,Storm在Ubuntu环境下的单机部署
- c语言中执行一次的函数once,iOS只执行一次的方法
- C++基础02-C++对c的拓展
- Ethernet帧结构
- java abstract类和abstract方法
- decode函数_「实践」云函数 + API,你也可以做个天气信息系统
- ELK收集java日志
- NGN学习笔记4——软交换中的协议2—Megaco/H.248
- java并发编程实践之安全发布和逸出
- html网站页面上字体改变,如何设置网页字体样式
- Delphi基础教程图文版之开篇
- wordpress后台固定菜单消失不见了怎么办?
- ROS2系列知识【5】:从海龟教程开始【1】
- 如何查看Linux磁盘空间大小
- scribed 安装
- 帝国CMS 7.2-插件包整合
- 作为程序员,我到底在恐慌什么!
- DS18B20温度传感器 ------ 自学笔记