HDU 5411(矩阵快速幂)
本题目意思:
给定n个点,给定一个n*n的转移矩阵,要求求出所有长度不大于M的序列个数,(M<=1E5 , n <= 50)
分析:
记 d[i][j] 生成至多长度为i的且以j开头的所有串的个数,d[i+1][j] = sum( d[ i][ k ] )+1( 其中 j->k可达)
那么
记矩阵tran (n+1,n+1)=
[ 0
A, 0
.
.
1,1,1,1.....1](其中A为转移矩阵)
[d[i][1],d[i][2], d[i][3]....d[i ][n], 1 ] * tran = [d[i+1][1],d[i+1][2], d[i+1][3]....d[i+1 ][n], 1 ];
这样先把tran快速幂M-1次,在求和即可。复杂度 (n^3*log(m));
自己第一开始是用的正推的公式,怎么也建不出转移矩阵,倒着推得好理解,好建矩阵,主要是矩阵当前矩阵只用来获取等号左边的值而不是右边。
#include<cstring>
#include<cstdio>
#include<algorithm>
#include <iostream>
using namespace std;
const int N = 55;
#define rep(i,n) for(int i=0;i<(int)n;i++)
#define rep1(i,x,y) for(int i=x;i<=(int)y;i++)
int n,m;
struct Matrix{int m[N][N];void init(){memset(m,0,sizeof(m)); }void standard(){rep1(i,0,n) rep1(j,0,n) m[i][j]=(i==j);}void show(){rep1(i,0,n) rep1(j,0,n){cout<<m[i][j]<<" "; if(j==n) cout<<endl;}}
};
const int mod = 2015;
Matrix mul(Matrix A,Matrix B){Matrix C;rep1(i,0,n) rep1(j,0,n){C.m[i][j]=0;rep1(k,0,n) C.m[i][j]=(C.m[i][j]+A.m[i][k]*B.m[k][j])%mod;}return C;
}
Matrix pow_mul(Matrix A,int b){Matrix ans; ans.standard();while(b){if(b&1) ans=mul(ans,A);A=mul(A,A);b>>=1;}return ans;
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d %d",&n,&m);Matrix A; A.init();rep(i,n){int k ,x; scanf("%d",&k);rep(j,k){scanf("%d",&x); --x;A.m[x][i]=1;}}rep1(i,0,n) A.m[n][i]=1;if(m == 0) { printf("1\n"); continue;}A = pow_mul(A,m-1);int ans = 0;rep1(i,0,n) rep1(j,0,n) ans=(ans+A.m[i][j])%mod;printf("%d\n",ans);}return 0;
}
HDU 5411(矩阵快速幂)相关推荐
- hdu 1757(矩阵快速幂)
题意:公式如下 If x < 10 f(x) = x. If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a ...
- hdu 5411 CRB and Puzzle(矩阵快速幂)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5411 解题思路: 题目大意: 给定n个点 常数m 下面n行第i行第一个数字表示i点的出边数,后面给出 ...
- HDU 6185 Covering 矩阵快速幂 递推
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6185 题目描述: 一个4*n的矩形, 你用1*2的矩形覆盖有多少种方案, n <= 1e18 ...
- hdu 5451 Best Solver 矩阵循环群+矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=5451 题意:给定x 求解 思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = ...
- 【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 2276 Kiki Little Kiki 2 (位运算+矩阵快速幂)
HDU 2276 Kiki & Little Kiki 2 (位运算+矩阵快速幂) ACM 题目地址:HDU 2276 Kiki & Little Kiki 2 题意: 一排灯,开关 ...
- hdu 2842 Chinese Rings 矩阵快速幂
分析: 后面的环能不能取下来与前面的环有关,前面的环不被后面的环所影响.所以先取最后面的环 设状态F(n)表示n个环全部取下来的最少步数 先取第n个环,就得使1~n-2个环属于被取下来的状态,第n-1 ...
- HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)
背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...
最新文章
- vue论坛网站的文章自动排版_基于 VuePress 定制个人博客网站
- jenkins插件findbugs+pmd+checkstyle结合sonar与maven(java环境代码质量和代码规范管理)...
- python网络爬虫权威指南 百度云-分析《Python网络爬虫权威指南第2版》PDF及代码...
- SpringMVC+redis整合
- 【百度地图API】如何制作多途经点的线路导航——驾车篇
- 教你11 周打造全能Python工程师!
- python notebook软件_Jupyter notebook快速入门教程(推荐)
- TaoLer V1.7.12版本简单迅捷的轻论坛系统源码
- Linux 内核简介
- ElementUI表格序号翻页后重置的解决办法
- java开发用win7好还是win10_win10和win7哪个好用|两个系统的性能比较
- linux下看学校的IPTV
- 用于使计算机发出嘟嘟声的宏命令,2012年计算机等级考试二级Access辅导笔记:Access宏的使用...
- 国产桌面操作系统到底怎么做才能有戏?
- Spring如何用“声明式事务”保护亿万数据安全?【万字解决并发冲突】
- 新年新玩法,数组“招婿”:老许,你要老婆不要?
- 在xml中定义excel的sheet_XML和Excel
- WAI-ARIA无障碍网页应用 HTML5 设计辅助功能
- 80、消防应急照明和疏散指示的要求
- RGB接口和MPU接口区别
热门文章
- 如何制作ISO光盘镜像,2款工具 PowerISO, UltraISO
- 论文笔记《Visual Dialog》
- python经典排序_经典排序 python实现
- common.js 通用方法封装
- 赚钱 36 计 - 第三十三计:众筹计
- 拷贝合并单元格时保留格式
- 6 个值得玩味的 Python 代码
- 即时通讯工具(IM)的网络营销价值
- 四个三菱FXF3UPLC N:N链接通讯控制八轴(三菱MR- J3)
- python智能家居教程_泡泡云服务器移植python3.6 home-assistant(智能家居平台)