题意:有若干字符,现在要把它们连成一个字符串,每种字符后面只能接特定种类的字符,现在询问能连接出的长度小于等于m的字符串有多少种。

思路:我们可以把这个转移关系看成一个图,如果字符a后面可以接b,那么从a向b连边。用邻接矩阵保存这个图。。。然后可以发现长度为m的字符串实际上是这个图中的一条长度为m(经过m个点)的路。那么可以想到一个经典结论:一个图中的k长路的条数等于这个图的邻接矩阵求k次幂后每项的和。

但是这样我们并不能直接得到答案,每次只能求出所有m长路。这里有个技巧,可以求出一个矩阵的1到m次幂的和。也就是A+A^2+A^3+....+A^m,这个和最后再求每一个元素的和就是答案了。

转移矩阵是这样的:

A   0

I    I

这个矩阵直接求m次幂,用矩阵快速幂最终算法是O(n^3logm)的,最后左下角那个位置就是要求的幂和(可以手工验证下。。)

PS:比赛的时候把mod写在了三重循环里面,其实,这个2015的mod很有深意啊。。。把mod写到第二重循环里面就过了啊。。卧槽。取模这么慢。。

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <map>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <set>
#include <cmath>
#define pb push_back
#define PB pop_back
#define fs first
//#define se second
#define sq(x) (x)*(x)
#define IINF (1<<29)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
const int mod=2015;
int sz;
int mid[110][110];
struct matrix{int m[110][110];matrix(){memset(m,0,sizeof m);}void mul(const matrix &b){memset(mid,0,sizeof mid);for(int i=0;i<sz;i++){for(int j=0;j<sz;j++){for(int k=0;k<sz;k++){mid[i][j]=(mid[i][j]+m[i][k]*b.m[k][j]);}mid[i][j]%=mod;}}for(int i=0;i<sz;i++){for(int j=0;j<sz;j++){m[i][j]=mid[i][j];}}}void selfmul(){memset(mid,0,sizeof mid);for(int i=0;i<sz;i++){for(int j=0;j<sz;j++){for(int k=0;k<sz;k++){mid[i][j]=(mid[i][j]+m[i][k]*m[k][j]);}mid[i][j]%=mod;}}for(int i=0;i<sz;i++){for(int j=0;j<sz;j++){m[i][j]=mid[i][j];}}}
};
matrix qpow(matrix x,ll p){matrix ans;for(int i=0;i<sz;i++){ans.m[i][i]=1;}while(p>0){if(p&1) ans.mul(x);x.selfmul();p>>=1;}return ans;
}
const int maxm=1e5+300;
int T;
int n,m;
bool trans[60][60];
int main(){freopen("/home/files/CppFiles/in","r",stdin);//freopen("/home/files/CppFiles/out","w",stdout);cin>>T;while(T--){memset(trans,0,sizeof trans);scanf("%d%d",&n,&m);sz=n*2;for(int i=1;i<=n;i++){int k;scanf("%d",&k);for(int j=0;j<k;j++){int x;scanf("%d",&x);trans[i-1][x-1]=1;}}matrix tt;for(int i=0;i<n;i++){for(int j=0;j<n;j++){tt.m[i][j]=trans[i][j];}}for(int i=n;i<2*n;i++){int j=i-n;tt.m[i][j]=1;tt.m[i][i]=1;}matrix ans=qpow(tt,m);int sum=0;for(int i=n;i<2*n;i++){for(int j=0;j<n;j++)sum=(sum+ans.m[i][j])%mod;}printf("%d\n",(sum+1)%mod);}return 0;
}

View Code

转载于:https://www.cnblogs.com/Cw-trip/p/4746307.html

2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂相关推荐

  1. 2018.10.09 ZYH的斐波那契数列(线段树+矩阵快速幂)

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

  2. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

  3. hdu 5411 CRB and Puzzle(矩阵快速幂)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5411 解题思路: 题目大意: 给定n个点 常数m 下面n行第i行第一个数字表示i点的出边数,后面给出 ...

  4. 2021HDU多校8 - 7057 Buying Snacks(矩阵快速幂套NTT优化dp)

    题目链接:点击查看 题目大意:给出 nnn 种糖果,每种糖果有大小包装之分,有三种购买方案,价钱分别如下: 单独购买一个小的,花费一块钱 单独购买一个大的,花费两块钱 ∀i>1\forall i ...

  5. hdu 5411 2015多校十1006 ~矩阵快速幂

    题意: 给定n个碎片的转移关系,问最多使用m个碎片组成的不同的序列个数是多少. 思路: 容易想到dp的方法,以dp[i][j]表示长度为i以j号碎片结尾的不同序列的数量.那么dp[i + 1][k] ...

  6. hdu5411CRB and Puzzle 矩阵快速幂

    //n个零件,一个模型最多可由m个零件组成 //在每一个零件后面只能由特定的零件组装 //问能够组成的模型的种类数 //先构造一个n*n的矩阵A,那么对于每一个 //A^(m-1)表示由m个零件组成, ...

  7. HDU - 5411 CRB and Puzzle 矩阵快速幂

    HDU - 5411 考虑直接dp会T, 用矩阵优化一下就好了. #include<bits/stdc++.h> #define LL long long #define LD long ...

  8. 【矩阵快速幂】 HDU 5411 CRB and Puzzle 等比

    点击打开链接 题意显然是 求 A+A^2+A^3+....+A^m 这就是经典题目 矩阵乘法十种经典题目 递归解决 后半部分提取 A^(m/2) 该题再特判下 m==1的时候 #include < ...

  9. HDU5411CRB and Puzzle(矩阵快速幂)

    题目链接:传送门 题意: 一个图有n个顶点,已知邻接矩阵,问点可以重复用长度小于m的路径有多少. 分析: 首先我们知道了邻接矩阵A,那么A^k代表的就是长度为k的路径有多少个.那么结果就是A^0+A^ ...

最新文章

  1. PyTorch 入门实战
  2. 【STM32】STM32F4时钟系统
  3. 浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别
  4. 【JEECG技术文档】JEECG online 表单填值规则使用说明
  5. 设置log缓存_Redis中缓存击穿 缓存穿透 缓存雪崩解决方案
  6. linux设置环境变量_Linux怎么设置系统环境变量之export命令详解
  7. vue 百度统计_2021暑期实习面经百度篇
  8. TextureView实现视频播放
  9. 分布式架构之缓存系统
  10. 深入浅出工厂设计模式
  11. 服务器装系统后安装驱动失败,windows10系统下驱动人生安装驱动失败如何解决
  12. 10 款富有创意的博客名片设计
  13. 知识图谱从入门到应用——知识图谱的知识表示:向量表示方法
  14. 英语发音之音标4---长元音法()
  15. PostgreSQL,MongoDB,Neo4j,OrientDB和ArangoDB比较
  16. protoc did not exit cleanly. Review output for more information报错
  17. python字符串算式加减运算(Python字符串运算)
  18. 天刀各区服务器位置,天刀服务器人数统计2017 | 手游网游页游攻略大全
  19. 【三维路径规划】基于RRT实现三维路径规划matlab源码
  20. CSS入门(CSS常用属性----字体、对齐方式、display属性、浮动)

热门文章

  1. php的foreach循环执行过程分析以及循环中执行unset()的一些问题
  2. 【深度学习】深入浅出transformer解决并行计算问题
  3. 【Ubuntu入门到精通系列讲解】Ubuntu 图形界面入门
  4. 【Web安全】提权—使用中国菜刀和iis6.exe在目标服务器创建Administrators用户
  5. python【力扣LeetCode算法题库】13- 罗马数字转整数
  6. oracle SQL 命令行(二.视图)
  7. spring boot中@ResponseBody等注解的作用与区别
  8. 特斯拉“刹车失灵”不绝于耳网络营销外包怎样看特斯拉进驻中国?
  9. 如何有效建设网站外链?
  10. php判断手机浏览器,PHP环境下判断客户端是否为手机浏览器