【题集】
【POJ 3233 Matrix Power Series 】 题解
题意
t组数据
输入n,m
接下来是n行,第i次输入,k表示有k个数与i相连
求相连的数量<=m的方案数
思路
构造矩阵
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;
#define mod 2015
int n, m;
struct mat
{
int a[55][55];
};
mat mul(mat a, mat b)
{
mat res;
memset(res.a, 0, sizeof(res.a));
for(int i = 0; i <= n; i++)
{
for(int k = 0; k <= n; k++)
{
if(a.a[i][k])
{
for(int j = 0; j <= n; j++)
{
if(b.a[k][j])
{
res.a[i][j] = (res.a[i][j] + a.a[i][k]*b.a[k][j]%mod)%mod;
}
}
}
}
}
return res;
}
mat mpower(mat a, int num)
{
mat I;
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
I.a[i][j] = (i==j);
}
}
while(num)
{
if(num&1) I = mul(I, a);
a = mul(a,a);
num >>= 1;
}
return I;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
mat tmp;
scanf("%d%d", &n, &m);
memset(tmp.a, 0, sizeof(tmp.a));
for(int i = 0; i < n; i++)
{
int k,b;
tmp.a[i][n] = 1;
scanf("%d", &k);
for(int j = 0; j < k; j++)
{
scanf("%d", &b);
b--;
tmp.a[i][b] = 1;
}
}
tmp.a[n][n] = 1;
tmp = mpower(tmp, m-1);
mat I;
memset(I.a, 0, sizeof(I.a));
for(int i = 0; i <= n; i++) I.a[0][i] = 1;
I = mul(I, tmp);
int ans = 0;
for(int i = 0; i <= n; i++) ans = (ans+I.a[0][i])%mod;
printf("%d\n", ans);
}
return 0;
}