题意:
给你个长为n的数列 a
给你一个变换
n行,第一个数为,后跟着几个数,
表示经过一次变换后的数由原序列哪几个数组成
#include<bits/stdc++.h>
using namespace std;
const long long N=1000;
int n;
struct node
{
long long a[55][55];
};
node cheng(node a,node b)
{
node c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%N)%N;
}
return c;
}
int main()
{
int r,t,l,k;
node a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&r);
memset(a.a,0,sizeof(a.a));
memset(b.a,0,sizeof(b.a));
for(int i=0;i<n;i++)
{
scanf("%lld",&(a.a[0][i]));
a.a[0][i]%=N;
}
for(int i=0;i<n;i++)
{
scanf("%d",&k);
while(k--)
{
scanf("%d",&l);
b.a[l][i]=1;
}
}
while(r)
{
if(r&1) a=cheng(a,b);
b=cheng(b,b);
r>>=1;
}
for(int i=0;i<n;i++)
printf("%lld%c",(a.a[0][i]%N+N)%N," \n"[i==n-1]);
}
return 0;
}