hdu 5411

来源:互联网 发布:淘宝宝贝草稿在哪里找 编辑:程序博客网 时间:2024/06/10 08:04

分析:

首先我们知道了邻接矩阵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;}


0 0