hdu 5411
2016-01-26 10:13
225 查看
分析:
首先我们知道了邻接矩阵A,那么A^k代表的就是长度为k的路径有多少个。那么结果就是A^0+A^1+A^2+...+A^m。然后我们可以构造一个矩阵来帮助我们求解。
X = [A,E;0,E]
==> 然后X^m 的矩阵的右上角的矩阵代表的就是A^0+A^1+A^2+...+A^m。
代码:
首先我们知道了邻接矩阵A,那么A^k代表的就是长度为k的路径有多少个。那么结果就是A^0+A^1+A^2+...+A^m。然后我们可以构造一个矩阵来帮助我们求解。
X = [A,E;0,E]
==> 然后X^m 的矩阵的右上角的矩阵代表的就是A^0+A^1+A^2+...+A^m。
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 105; const int mod = 2015; struct Matrix { int m[maxn][maxn]; Matrix() { memset(m,0,sizeof(m)); } }; int n,m; Matrix I; Matrix mul(Matrix a,Matrix b) { Matrix c; for(int i = 1; i <= 2*n; i++) for(int j = 1; j <= 2*n; j++) { for(int k = 1; k <= 2*n; k++) { c.m[i][j] = (c.m[i][j] + a.m[i][k]*b.m[k][j]) % mod; } } return c; } Matrix power(int k,Matrix A) { Matrix ans = I; while(k) { if(k & 1) ans = mul(ans,A); A = mul(A,A); k = k >> 1; } return ans; } void init() { for(int i = 1; i < maxn; i++) I.m[i][i] = 1; } int main() { int t; init(); cin>>t; while(t--) { cin>>n>>m; Matrix A; for(int i = 1; i <= n; i++) { int k,a; cin>>k; while(k--) { cin>>a; A.m[i][a] = 1; } } for(int i=1; i<=n; i++) A.m[i][i+n] = 1; for(int i=n+1; i<=2*n; i++) A.m[i][i] = 1; int sum = 0; A = power(m,A); for(int i = 1; i <= n; i++) for(int j = n+1; j <= 2*n; j++) sum = (sum + A.m[i][j]) % mod; cout<<sum+1<<endl; } return 0; }
相关文章推荐
- C#实现矩阵乘法实例分析
- C#中矩阵运算方法实例分析
- C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法
- C#计算矩阵的秩实例分析
- C#实现矩阵转置的方法
- C#检测两个矩阵是否相等的方法
- Javascript图像处理―为矩阵添加常用方法
- 利用C++实现矩阵的相加/相称/转置/求鞍点
- python实现矩阵乘法的方法
- C#判断一个矩阵是否为对称矩阵及反称矩阵的方法
- C#计算矩阵的逆矩阵方法实例分析
- C++实现矩阵原地转置算法
- C#实现矩阵加法、取负、数乘、乘法的方法
- 从零开始学习OpenGL ES之七 – 变换和矩阵
- 矩阵乘法 c实现
- 程序员能力矩阵翻译
- 初学数模-MATLAB Quick Start! Part II
- 查找一个list中各个数组的元素在一个固定数组中的位置, 并把位置信息记录到一个矩阵里
- Rotate Image
- [Matlab]如何随机产生信息码元矩阵u