http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1973
//1864877 2009-05-11 19:06:51 Accepted  2974 C++ 0 188 aslys 
//烦了点,却也无心改进了~  懒惰
#include<iostream>
using namespace std;
const int N = 22;
int n;
double matrix[N][N];
void fun(int k,double m[][N])
{
    
int i,j,p,t;
    
double x[N][N],y[N][N],sum;
    
if(k == 1)  //矩阵的一次方
    {
        
for(i=1;i<=n;i++)
            
for(j=1;j<=n;j++)
                m[i][j] 
= matrix[i][j];
    }

    
else if(k == 2//矩阵的二次方
    {
        
for(i=1;i<=n;i++)
            
for(j=1;j<=n;j++)
            
{
                sum 
= matrix[i][1* matrix[1][j];
                
for(p=2;p<=n;p++)
                    sum 
+= matrix[i][p] * matrix[p][j];
                m[i][j] 
= sum;
            }

    }

    
else  //矩阵的 k 次方 ,先计算出 k/2 次方 ,加快计算速度
    
        t 
= k/2;    
        fun(t,x); 
//递归调用
        for(i=1;i<=n;i++)
            
for(j=1;j<=n;j++)
            
{
                sum 
= x[i][1* x[1][j];
                
for(p=2;p<=n;p++)
                    sum 
+= x[i][p] * x[p][j];
                y[i][j] 
= sum;
            }

        
if( k % 2 == 1)      // 比如对矩阵A :A^9 = A^4 * A^4 * A
        {
            
for(i=1;i<=n;i++)
                
for(j=1;j<=n;j++)
                
{
                    sum 
= matrix[i][1* y[1][j];
                     
for(p=2;p<=n;p++)
                         sum 
+= matrix[i][p] * y[p][j];;
                    m[i][j] 
= sum;
            }

        }

        
else    
        
{
            
for(i=1;i<=n;i++)
                
for(j=1;j<=n;j++)
                    m[i][j] 
= y[i][j];            
        }

    }

}


int main()
{
    
int t;
    cin
>>t;
    
while(t--)
    
{
        
int i,j,k;
        
int m;
        
double x[N][N],water[N],r;
        scanf(
"%d",&n);
        
for(i=1;i<=n;i++)//init()
            for(j=1;j<=n;j++)
                matrix[i][j] 
= 0.0;

        
for(i=1;i<=n;i++)
            scanf(
"%lf",&water[i]);

        
for(i=1;i<=n;i++)
        
{
            scanf(
"%d",&k);
            
if( k == 0 ) ///除数不能为零,切记切记 
            {
                matrix[i][i] 
= 1.0;
                
continue;
            }

            r 
= 1.0/(double)k;
            
while(k--)
            
{
                scanf(
"%d",&j);
                matrix[j][i] 
= r; //构建初始矩阵
            }

        }

        scanf(
"%d",&m);

        fun(m,x); 
//求矩阵的m次方,结果放在 x 数组中

        
for(i=1;i<=n;i++)
        
{
            r 
= 0.0;
            
for(j=1;j<=n;j++)
                r 
+= x[i][j] * water[j];
            
if(i == 1)
                printf(
"%.2lf",r);
            
else
                printf(
" %.2lf",r);
        }

        printf(
"\n");
    }

    
return 0;
}