uva11551experienced endeavour

来源:互联网 发布:淘宝网密码登录不了 编辑:程序博客网 时间:2024/06/08 01:35

题意:

给你个长为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;}







原创粉丝点击