您的位置:首页 > 其它

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。

代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  矩阵