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 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  pieces?
(Two patterns  and  are
considered different if their lengths are different or there exists an integer  such
that -th
piece of  is
different from corresponding piece of .)

Input

There are multiple test cases. The first line of input contains an integer ,
indicating the number of test cases. For each test case:

The first line contains two integers ,  denoting
the number of kinds of pieces and the maximum number of moves.

Then  lines
follow. -th
line is described as following format.

k

Here  is
the number of kinds which can be assembled to the right of the -th
kind. Next  integers
represent each of them.

1 ≤  ≤
20

1 ≤  ≤
50

1 ≤  ≤

0 ≤  ≤

1 ≤  <  <
… <  ≤
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)

解题思路:

DP方程非常easy想到 dp[i][j] = sum(dp[i-1][k] <k,j>连通) 构造矩阵用矩阵高速幂加速就可以。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#define LL long long
using namespace std;
const int MAXN = 55 + 10;
const int mod = 2015;
int n, m;
struct Matrix
{
    int m[MAXN][MAXN];
    Matrix(){memset(m, 0, sizeof(m));}
    Matrix operator * (const Matrix &b)const
    {
        Matrix res;
        for(int i=1;i<=n+1;i++)
        {
            for(int j=1;j<=n+1;j++)
            {
                for(int k=1;k<=n+1;k++)
                {
                    res.m[i][j] = (res.m[i][j] + m[i][k] * b.m[k][j]) % mod;
                }
            }
        }
        return res;
    }
};
Matrix pow_mod(Matrix a, int b)
{
    Matrix res;
    for(int i=1;i<=n+1;i++) res.m[i][i] = 1;
    while(b)
    {
        if(b & 1) res = res * a;
        a = a * a;
        b >>= 1;
    }
    return res;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        Matrix a, b;
        scanf("%d%d", &n, &m);
        for(int i=1;i<=n+1;i++) a.m[i][n+1] = 1;
        for(int i=1;i<=n;i++)
        {
            int x, k;scanf("%d", &k);
            for(;k--;)
            {
                scanf("%d", &x);
                a.m[i][x] = 1;
            }
        }
        a = pow_mod(a, m);
        int ans = 0;
        for(int i=1;i<=n+1;i++) ans = (ans + a.m[i][n+1]) % mod;
        printf("%d\n", ans);
    }
    return 0;
}
时间: 2024-12-14 20:25:56

HDU 5411 CRB and puzzle (Dp + 矩阵高速幂)的相关文章

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 (2015年多校比赛第10场)

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

HDU 4965 Fast Matrix Calculation(矩阵高速幂)

HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次.能够变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个仅仅有6x6.就能够用矩阵高速幂搞了 代码: #include <cstdio> #include <cstring> const int N = 1005; const int M = 10; int n, m; int A[N][M], B[M][N], C[M][M], CC[N

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>

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 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

HDU 2294 Pendant (DP+矩阵快速幂降维)

HDU 2294 Pendant (DP+矩阵快速幂降维) ACM 题目地址:HDU 2294 Pendant 题意: 土豪给妹子做首饰,他有K种珍珠,每种N个,为了炫富,他每种珍珠都要用上.问他能做几种长度[1,N]的首饰. 分析: 1 ≤ N ≤ 1,000,000,000简直可怕. 首先想dp,很明显可以想到: dp[i][j] = (k-(j-1))*dp[i-1][j-1] + j*dp[i-1][j](dp[i][j]表示长度为i的并且有j种珍珠的垂饰有多少个) 然后遇到N太大的话,

hdu 5318 The Goddess Of The Moon 矩阵高速幂

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 438    Accepted Submission(s): 150 Problem Description Chang'e (嫦娥) is

HDU 2604 Queuing 矩阵高速幂

QueuingTime Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2483    Accepted Submission(s): 1169 Problem Description Queues and Priority Queues are data structures which are known to most computer s