hdu5411 CRB and Puzzle

CRB and Puzzle

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1177    Accepted Submission(s): 468

Problem Description

CRB is now playing Jigsaw Puzzle.
There are N kinds of pieces with infinite supply.
He can assemble one piece to the right side of the previously assembled one.
For each kind of pieces, only restricted kinds can be assembled with.
How many different patterns he can assemble with at most M pieces? (Two patterns P and Q are considered different if their lengths are different or there exists an integer j such that j-th piece of P is different from corresponding piece of Q.)

Input

There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:
The first line contains two integers N, M denoting the number of kinds of pieces and the maximum number of moves.
Then N lines follow. i-th line is described as following format.
k a_{1}\ a_{2}\ ...\ a_{k}
Here k is the number of kinds which can be assembled to the right of the i-th kind. Next k integers represent each of them.
1 ≤ T ≤ 20
1 ≤ N ≤ 50
1 ≤ M ≤ 10^5
0 ≤ k ≤ N
1 ≤ a_{1} < a_{2} < … < a_{k} ≤ N

Output

For each test case, output a single integer - number of different patterns modulo 2015.

Sample Input

1
3 2
1 2
1 3
0

Sample Output

6

Hint

possible patterns are ∅, 1, 2, 3, 1→2, 2→3

Author

KUT(DPRK)

Source

2015 Multi-University Training Contest 10

Recommend

wange2014

同样的题:不同的写法,却得不出相同的答案。poj3233 Matrix Power Series

求解

Select Code

#include<cstdio>
#include<cstring>
using namespace std;
const int mod=2015;
struct matrix{
	int s[102][102];
	matrix(){
		memset(s,0,sizeof s);
	}
}A,F;int n,m,T;int ans;
matrix operator *(const matrix &a,const matrix &b){
	matrix c;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			for(int k=0;k<n;k++){
				c.s[i][j]+=a.s[i][k]*b.s[k][j];
			}
			c.s[i][j]%=mod;
		}
	}
	return c;
}
matrix fpow(matrix a,int p){
	matrix res;
	for(int i=0;i<n;i++) res.s[i][i]=1;
	for(;p;p>>=1,a=a*a) if(p&1) res=res*a;
	return res;
}
int main(){
	for(scanf("%d",&T);T--;){
		scanf("%d%d",&n,&m);
		matrix A;
		for(int i=0,k,x;i<n;i++){
			scanf("%d",&k);
			while(k--){
				scanf("%d",&x);x--;
				A.s[i][x]=1;
			}
		}
		for(int i=0;i<n;i++) A.s[i][i+n]=A.s[i+n][i+n]=1;
		n<<=1;
		A=fpow(A,m);
		n>>=1;
		ans=1;
		for(int i=0;i<n;i++){
        	for(int j=n;j<2*n;j++){
        		ans+=A.s[i][j];
			}
		}
		ans%=mod;
		printf("%d\n",ans);
	}
	return 0;
}
时间: 2024-10-10 18:46:49

hdu5411 CRB and Puzzle的相关文章

[hdu5411 CRB and Puzzle]DP,矩阵快速幂

题意:给一个有向图,从任意点开始,最多走m步,求形成的图案总数. 思路:令dp[i][j]表示走j步最后到达i的方法数,则dp[i][j]=∑dp[k][j-1],其中k表示可以直接到达i的点,答案=∑dp[i][j].关键在于如何减少状态转移的时间,考虑用矩阵加速. 构造矩阵:D = ,其中a[i][j]表示有向图,用于状态转移,右边的一列1用于累加答案 则答案=[1,1,...1n+1]*DM-1=∑∑DM-1[i][j],1≤i≤n+1,1≤j≤n+1 PS:封装的ModInt放矩阵的最里

HDOJ 5411 CRB and Puzzle 矩阵快速幂

直接构造矩阵,最上面一行加一排1.快速幂计算矩阵的m次方,统计第一行的和 CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 133    Accepted Submission(s): 63 Problem Description CRB is now playing Jigsaw Puzzle. There

HDU 5411 CRB and puzzle (Dp + 矩阵高速幂)

CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 483    Accepted Submission(s): 198 Problem Description CRB is now playing Jigsaw Puzzle. There are  kinds of pieces with infinite

HDOJ 5411 CRB and Puzzle 矩阵高速幂

直接构造矩阵,最上面一行加一排1.高速幂计算矩阵的m次方,统计第一行的和 CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 133    Accepted Submission(s): 63 Problem Description CRB is now playing Jigsaw Puzzle. There

HDU 5411 CRB and Puzzle (2015年多校比赛第10场)

1.题目描写叙述:pid=5411">点击打开链接 2.解题思路:本题实际是是已知一张无向图.问长度小于等于m的路径一共同拥有多少条. 能够通过建立转移矩阵利用矩阵高速幂解决.当中,转移矩阵就是输入时候的邻接矩阵,同一时候多添加最后一列,都置为1.表示从i開始的,长度不超过M的路径的答案总数(最后一行的1~n列为全0行,能够理解为空集),那么把转移矩阵自乘M-1次后就是路径长度为M的转移矩阵(这里的路径长度指的是顶点的个数.顶点=边数+1,因此仅仅须要乘M-1次). 为何便于求和.能够设置

hdu 5411 CRB and Puzzle 矩阵高速幂

链接 题解链接:http://www.cygmasot.com/index.php/2015/08/20/hdu_5411/ 给定n个点 常数m 以下n行第i行第一个数字表示i点的出边数.后面给出这些出边. 问:图里存在多少条路径使得路径长度<=m.路径上的点能够反复. 思路: 首先能得到一个m*n*n的dp.dp[i][j]表示路径长度为i 路径的结尾为j的路径个数 . 答案就是sigma(dp[i][j]) for every i from 1 to m, j from 1 to n; 我们

hdu 5411 CRB and Puzzle (矩阵快速幂优化dp)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5411 题意:按题目转化的意思是,给定N和M,再给出一些边(u,v)表示u和v是连通的,问走0,1,2.....M步的方案数. 分析:这题和 hdu5318 The Goddess Of The Moon差不多,就是多了一个等比数列求和. 代码: #include <cstdio> #include <iostream> #include <cstring> using name

HDU - 5411 CRB and Puzzle 矩阵快速幂

HDU - 5411 考虑直接dp会T, 用矩阵优化一下就好了. #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int>

HDOJ 5409 CRB and Graph 无向图缩块

无向图缩块后,以n所在的块为根节点,dp找每块中的最大值. 对于每一个桥的答案为两块中的较小的最大值和较小的最大值加1 CRB and Graph Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 113    Accepted Submission(s): 41 Problem Description A connected, undi