1 3 2 1 2 1 3 0
6Hintpossible patterns are ∅, 1, 2, 3, 1→2, 2→3
显然矩阵DP,记得A+A^2+..+A^N 可以用矩阵快速二分优化
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<cctype> #include<ctime> #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (x<<1) #define Rson ((x<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (2139062143) #define F (2015) #define eps (1e-3) #define MAXN (50+10) typedef __int64 ll; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} struct M { int n,m; ll a[MAXN][MAXN]; M(int _n=0){n=m=_n;MEM(a);} M(int _n,int _m){n=_n,m=_m;MEM(a);} void mem (int _n=0){n=m=_n;MEM(a);} void mem (int _n,int _m){n=_n,m=_m;MEM(a);} friend M operator*(M a,M b) { M c; c.mem(a.n,b.m) ; For(k,a.m) For(i,a.n) For(j,b.m) c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%F; return c; } friend M operator+(M a,M b) { For(i,a.n) For(j,a.m) a.a[i][j]=(a.a[i][j]+b.a[i][j])%F; return a; } void make_I(int _n) { n=m=_n; MEM(a) For(i,n) a[i][i]=1; } }f; M a; int n,m; bool a2[1000000]; M pow2(M a,ll b) { M c;c.make_I(a.n); int n=0;while (b) a2[++n]=b&1,b>>=1; For(i,n) { if (a2[i]) c=c*a; a=a*a; } return c; } bool a3[1000000]; M pow222(M a,ll b) { M c;c.make_I(a.n); int n=0;while (b) a3[++n]=b&1,b>>=1; c=a; b=1; M d=c; ForD(i,n-1) { b=b*2+a3[i]; c=c*d+c; d=d*d; if (a3[i]) c=c*a+a,d=d*a; } return c; } M pow22(M a,ll b) { M c;c.make_I(a.n); if (b==0) return c; if (b==1) return a; c=pow22(a,b/2); c=c*pow2(a,b/2)+c; if (b&1) c=c*a+a; return c; } int main() { // freopen("Puzzle.in","r",stdin); int T; cin>>T; while(T--) { scanf("%d%d",&n,&m); f.mem(n); For(i,n) { int k;scanf("%d",&k); For(j,k) { int p; scanf("%d",&p); f.a[p][i]=1; } } if (m==1) { cout<<n+1<<endl; continue; } // f.pri(); f=pow222(f,m-1); // f.pri(); ll ans=1+n; For(i,n) For(j,n) upd(ans,f.a[i][j]); printf("%I64d\n",ans); } return 0; }