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 namespace std;
const int mod = 2015;
int N,M;
struct Matrix
{
	int M[55][55];
	Matrix(){memset(M,0,sizeof(M));}
}U,P;

Matrix Add(const Matrix &a,const Matrix &b)
{
	Matrix ret;
	for(int i=1;i<=N;i++)
		for(int j=1;j<=N;j++)
			ret.M[i][j]=(a.M[i][j]+b.M[i][j])%mod;
	return ret;
}

Matrix Multi(const Matrix &a,const Matrix &b)
{
	Matrix ret;
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=N;j++)
		{
			for(int k=1;k<=N;k++)
				ret.M[i][j]+=a.M[i][k]*b.M[k][j];
			ret.M[i][j]%=mod;
		}
	}
	return ret;
}
Matrix Pow(Matrix f,int n)  //f^n,U为单位矩阵
{
	Matrix ret=U;
	while(n)
	{
		if(n&1)
			ret=Multi(ret,f);
		n>>=1;
		f=Multi(f,f);
	}
	return ret;
}

Matrix solve(int n) //等比数列求和
{
	if(n==1)
		return P;
	Matrix temp=solve(n>>1);
	if(n&1)
	{
		Matrix t=Pow(P,n/2+1);
		return Add(Add(Multi(temp,t),temp),t);
	}
	else
		return Add(temp,Multi(temp,Pow(P,n>>1)));
}

int main()
{
	int ncase,i,j,k,x;
	for(i=0;i<55;i++)
		U.M[i][i]=1;
	scanf("%d",&ncase);
	while(ncase--)
	{
		scanf("%d%d",&N,&M);
		memset(P.M,0,sizeof(P.M));
		for(i=1;i<=N;i++)
		{
			scanf("%d",&k);
			while(k--)
			{
				scanf("%d",&x);
				P.M[i][x]=1;
			}
		}
		if(M==1)
		{
			printf("%d\n",N+1);
			continue ;
		}
		Matrix temp=solve(M-1);
		int ans=N+1;
		for(i=1;i<=N;i++)
			for(j=1;j<=N;j++)
				ans+=temp.M[i][j];
		printf("%d\n",ans%mod);
	}
	return 0;
}
时间: 2024-10-12 07:50:04

hdu 5411 CRB and Puzzle (矩阵快速幂优化dp)的相关文章

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 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 矩阵高速幂

链接 题解链接: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; 我们

矩阵快速幂 优化dp 模板

相关博客 :https://blog.csdn.net/china_xyc/article/details/89819376#commentBox 关于能用矩阵乘法优化的DP题目,有如下几个要求: 转移式只有加法,清零,减法etc.,max和min运算不允许 转移式中关于前几位dp结果得到的系数必须是常量 转移次数一般超级多 由于转移次数多,一般都要模一个int范围内的数 综上,举一个例子: dp[i]=a×dp[i−1]+b×dp[i−2]+c×dp[i−3] 其中,a,b,c是常量,而在需要

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

bzoj 4000 矩阵快速幂优化DP

建立矩阵,跑快速幂 1 /************************************************************** 2 Problem: 4000 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:32 ms 7 Memory:836 kb 8 ****************************************************************/ 9 10 #inclu

排队 矩阵快速幂优化dp

\(T1\) 排队 ? Description ?? 抢饭是高中生活的一部分,现在有一列队伍长度为 \(n\),(注意:由于人与人之间要保持距离,且不同情况所保持的距离大小不同,所以长度并不能直接体现队列的人数).已知男男之间的距离为 \(a\),男女之间距离为 bb,女女之间距离为 \(c\).一个男生打饭时间为 \(d\),一个女生打饭时间为 \(e\),求所有情况的排队时间总和(忽略身体的大小对队伍长度的贡献),答案对 $10^{9}+7 $取模. ?? Input Format 一行六个

hdu 5564 Clarke and digits 矩阵快速幂优化数位dp

Clarke and digits Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description Clarke is a patient with multiple personality disorder. One day, Clarke turned into a researcher, did a research on digits. He w

LibreOJ #2325. 「清华集训 2017」小Y和恐怖的奴隶主(矩阵快速幂优化DP)

哇这题剧毒,卡了好久常数才过T_T 设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=\sum \frac{1}{sum+1}*(f(i+1,s')+[s==s'])$ 状态数只有$C_{8+3}^3=165$个,所以就可以矩乘优化啦.再加上一个用于转移的$1$,矩阵大小是$166*166$的,因为多组询问,所以可以先把$2$的所有次幂的矩阵都预处理出来. 然后会发现复杂度是$O(T*166^3