链接

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

我们先计算 路径长度恰好为 i 的方法数。

用矩阵高速幂,会发现是

当中B矩阵是一个n*n的矩阵。也就是输入的邻接矩阵。

A是一个n行1列的矩阵 A[i][1]表示长度为1且以i结尾的路径个数,所以A矩阵是全1矩阵。

相乘得到的n*1 的矩阵求和就是路径长度恰好为i的条数。

那么<=m的路径就是:

把A提出来,里面就是一个关于B的矩阵等比数列。

B的求发主要是二分。详见POJ3233

模板不大好,交G++能过

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<ctime> using namespace std;
template <class T>
inline bool rd(T &ret) {
char c; int sgn;
if (c = getchar(), c == EOF) return 0;
while (c != '-' && (c<'0' || c>'9')) c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x <0) {
putchar('-');
x = -x;
}
if (x>9) pt(x / 10);
putchar(x % 10 + '0');
}
const int mod = 2015;
const int N = 51; struct Matrix
{
int m[N][N];
}G[2000];
int top;
Matrix I;
int n, k;
const int M = 2015;
Matrix add(Matrix a, Matrix b)
{
Matrix &c = G[top++];
for (int i = 0; i<n; i++)
{
for (int j = 0; j<n; j++)
{
c.m[i][j] = a.m[i][j] + b.m[i][j];
c.m[i][j] %= M;
}
}
top--;
return c;
} Matrix multi(Matrix a, Matrix b)
{
Matrix &c = G[top++];
for (int i = 0; i<n; i++)
{
for (int j = 0; j<n; j++)
{
c.m[i][j] = 0;
for (int k = 0; k<n; k++)
c.m[i][j] += a.m[i][k] * b.m[k][j];
c.m[i][j] %= M;
}
}
top--;
return c;
} Matrix power(Matrix A, int n)
{
Matrix &ans = G[top++], &p = G[top++];
ans = I; p = A;
while (n)
{
if (n & 1)
{
ans = multi(ans, p);
n--;
}
n >>= 1;
p = multi(p, p);
}
top -= 2;
return ans;
} Matrix sum(Matrix A, int k)
{
if (k == 1) return A;
Matrix &t = G[top++];
t = sum(A, k / 2);
if (k & 1)
{
Matrix &cur = G[top++];
cur = power(A, k / 2 + 1);
t = add(t, multi(t, cur));
t = add(t, cur);
top--;
}
else
{
Matrix &cur = G[top++];
cur = power(A, k / 2);
t = add(t, multi(t, cur));
top--;
}
top--;
return t;
} int m;
void add(int &x, int y){
x += y;
if (x >= mod)x -= mod;
}
int B[N][N];
int main(){
memset(I.m, 0, sizeof I.m);
for (int i = 0; i < N; i++)I.m[i][i] = 1;
int T; rd(T);
while (T--){
rd(n); rd(m);
Matrix A;
top = 0;
memset(A.m, 0, sizeof A.m);
for (int i = 1; i <= n; i++) {
int tmp; rd(tmp); while (tmp--) { int u; rd(u); A.m[i-1][u-1] = 1; }
}
if (m == 0) { puts("1"); continue; }
if (m == 1){ pt(n + 1); puts(""); continue; }
Matrix ans = sum(A, m-1);
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
B[i][j] = ans.m[i][j]; for (int i = 0; i < n; i++)B[i][i] ++;
int hehe = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
add(hehe, B[i][j]);
}
pt(1 + hehe); puts("");
}
return 0;
}
/*
99
1 10
1 1 3 100000
3 1 2 3
3 1 2 3
3 1 2 3 5 3
5 1 2 3 4 5
4 2 3 4 5
3 1 3 5
5 1 2 3 4 5
3 1 2 3 */

hdu 5411 CRB and Puzzle 矩阵高速幂的更多相关文章

  1. hdu 5411 CRB and Puzzle (矩阵高速幂优化dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5411 题意:按题目转化的意思是,给定N和M,再给出一些边(u,v)表示u和v是连通的,问走0,1,2... ...

  2. HDOJ 5411 CRB and Puzzle 矩阵高速幂

    直接构造矩阵,最上面一行加一排1.高速幂计算矩阵的m次方,统计第一行的和 CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  3. HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

    HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意:  g(i)=k*i+b;i为变量.  给出 ...

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

    CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

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

    1.题目描写叙述:pid=5411">点击打开链接 2.解题思路:本题实际是是已知一张无向图.问长度小于等于m的路径一共同拥有多少条. 能够通过建立转移矩阵利用矩阵高速幂解决.当中,转 ...

  6. HDU 2256 Problem of Precision(矩阵高速幂)

    题目地址:HDU 2256 思路: (sqrt(2)+sqrt(3))^2*n=(5+2*sqrt(6))^n; 这时要注意到(5+2*sqrt(6))^n总能够表示成an+bn*sqrt(6); a ...

  7. hdu 4965 Fast Matrix Calculation(矩阵高速幂)

    题目链接.hdu 4965 Fast Matrix Calculation 题目大意:给定两个矩阵A,B,分别为N*K和K*N. 矩阵C = A*B 矩阵M=CN∗N 将矩阵M中的全部元素取模6,得到 ...

  8. 2015 Multi-University Training Contest 10 hdu 5411 CRB and Puzzle

    CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  9. HDU - 1588 Gauss Fibonacci (矩阵高速幂+二分求等比数列和)

    Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very cle ...

随机推荐

  1. python 9:list.reverse()(倒置原列表,可恢复改变)

    bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles) bicycles.reverse() #倒置原列 ...

  2. POJ 3481 set水过

    题意:1表示插入客户K,他的优先级是P(相当于大小),2表示输出当前优先级最高的客户(即找出最大值),并且删除.3同理输出最低级的. 这题可以用splay treap AVL SBT -- (可是我并 ...

  3. 认识JDK、JRE、JVM

    JDK.JRE.JVM之间的关系: 首先看看JDK与JRE的区别与联系,如下图所示: 由图可知: JDK = JRE + Tools&Tool APIs JDK的核心是Java SE API. ...

  4. HBase编程 API入门系列之delete(客户端而言)(3)

    心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面的基础,如下 HBase编程 API入门系列之put(客户端而言)(1) HBase编程 API入门系列之get(客户端而言) ...

  5. android平台 cocos2d-x 读取相册数据

    现已解决 方案如下: 1.使用 jni 调用 java 方法 启动相册选择框2.使用java将获取的图片保存到本地3.使用Cocos2d-x中 CCImage 读取 JAVA代码如下: //启动图片选 ...

  6. Spring Cloud (1) 服务的注册与发现(Eureka)

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  7. 使用File类操作文件或目录的属性

    在学I/O流之前,我先总结一下使用File类操作文件或目录的属性. package com.File; import java.io.File; import java.io.IOException; ...

  8. win7 64位装sql2000

    1.运行不了安装程序 右击安装exe文件->属性->兼容性->以xp sp3兼容和管理员身份 2.安装过程中提示“被挂起”的故障 解决:打开注册表编辑器,在HKEY_LOCAL_MA ...

  9. 工作中总结的经验之git篇

    不要以为你会git,你要知道,git不是只有commit和push 由于系统分析与设计的期末Project需要团队合作开发,因此在这里想谈谈GitHub团队项目合作开发的流程: 项目创建 项目负责人在 ...

  10. day002 计算机基础之 操作系统和编程语言的分类

    &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp今天主要针对计算机基础中的操作系统和编程语言的分类进行了讲解. 操作系统 &nbsp ...