#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 52;
long long ans=0;
struct Mat {
int mat[N][N];
};
int num[N];
int n, m;
Mat a;
void init() {
int i,j;
int x,k;
memset(a.mat,0,sizeof(a.mat));
for(i = 1; i <= n; ++i) {
cin>>x;
for (j=1;j<=x;j++)
{
cin>>k;
a.mat[i][k]=1;
}
}
for (i=1;i<=n+1;i++)
a.mat[i][n+1]=1;
}
Mat operator * (Mat a, Mat b) {
Mat c;
memset(c.mat,0,sizeof(c.mat));
int i, j, k;
for(k = 1; k <=n; ++k) {
for(i = 1; i <=n; ++i) { //***
for(j = 1; j <=n; ++j) { //***
c.mat[i][j] = (c.mat[i][j]+a.mat[i][k] * b.mat[k][j])%2015;
}
}
}
return c;
}
Mat operator ^ (Mat a, int k) {
Mat c;
int i, j;
for(i = 1; i <=n; ++i)
for(j = 1; j <=n; ++j)
c.mat[i][j] = (i == j);
for(; k; k >>= 1) {
if(k&1) c = c*a;
a = a*a;
}
return c;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
init();
n++;
int k,i,j;
Mat c;
c=a^(m-1);
long long ans=0;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
ans=(ans+c.mat[i][j])%2015;
}
cout<<ans<<endl;
}
return 0;
}
hdu 5411 多校——矩阵快速幂模板
最新推荐文章于 2018-11-24 20:54:00 发布