链接

题解链接: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. EF6 自定义迁移表名

    在下列代码片段中已经EF6迁移表的表名更改为 MigrationHistory注意:下代码片段建议和DbContext同程序集 public class ModelConfiguration : Db ...

  2. SPOJ GSS1 & GSS3&挂了的GSS5

    线段树然后yy一下,搞一搞. GSS1: 题意:求最大区间和. #include <cstdio> #include <algorithm> using namespace s ...

  3. Android学习——数据存储之文件存储

    将数据存储到文件中并读取数据 1.新建FilePersistenceTest项目,并修改activity_main.xml中的代码,如下:(只加入了EditText,用于输入文本内容,不管输入什么按下 ...

  4. 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别

    1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...

  5. THREE.js代码备份——webgl - materials - cube refraction [balls](以上下左右前后6张图片构成立体场景、透明球体效果)

    <!DOCTYPE html> <html lang="en"> <head> <title>three.js webgl - ma ...

  6. 读书笔记「Python编程:从入门到实践」_4.操作列表

    4.1 遍历整个列表   4.1.1 深入地研究循环   4.1.2 在for循环中执行更多的操作   4.1.3 在for循环结束后执行一些操作  例 magicians = ['alice', ' ...

  7. 【sqli-labs】 less14 POST - Double Injection - Single quotes- String -twist (POST型单引号变形双注入)

    名字和less13一样? 看了下源码对比 less13 less14 less14应该是双引号吧 出错 构造永真登陆

  8. Mysql正则

    摘自:http://www.runoob.com/mysql/mysql-regexp.html 模式 描述 ^ 匹配输入字符串的开始位置.如果设置了 RegExp 对象的 Multiline 属性, ...

  9. (转)OL记载Arcgis Server切片

    http://blog.csdn.net/gisshixisheng/article/details/47955787 概述: 本文讲述如何在OpenLayers中调用Arcgis Server切片并 ...

  10. C#判断文件是否存在 //创建txt文件

    if(System.IO.File.Exists(@"")) { } if (System.IO.File.Exists(HttpRuntime.AppDomainAppPath ...