2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂
题意:有若干字符,现在要把它们连成一个字符串,每种字符后面只能接特定种类的字符,现在询问能连接出的长度小于等于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长路条数,矩阵快速幂相关推荐
- 2018.10.09 ZYH的斐波那契数列(线段树+矩阵快速幂)
描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...
- HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...
- hdu 5411 CRB and Puzzle(矩阵快速幂)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5411 解题思路: 题目大意: 给定n个点 常数m 下面n行第i行第一个数字表示i点的出边数,后面给出 ...
- 2021HDU多校8 - 7057 Buying Snacks(矩阵快速幂套NTT优化dp)
题目链接:点击查看 题目大意:给出 nnn 种糖果,每种糖果有大小包装之分,有三种购买方案,价钱分别如下: 单独购买一个小的,花费一块钱 单独购买一个大的,花费两块钱 ∀i>1\forall i ...
- hdu 5411 2015多校十1006 ~矩阵快速幂
题意: 给定n个碎片的转移关系,问最多使用m个碎片组成的不同的序列个数是多少. 思路: 容易想到dp的方法,以dp[i][j]表示长度为i以j号碎片结尾的不同序列的数量.那么dp[i + 1][k] ...
- hdu5411CRB and Puzzle 矩阵快速幂
//n个零件,一个模型最多可由m个零件组成 //在每一个零件后面只能由特定的零件组装 //问能够组成的模型的种类数 //先构造一个n*n的矩阵A,那么对于每一个 //A^(m-1)表示由m个零件组成, ...
- HDU - 5411 CRB and Puzzle 矩阵快速幂
HDU - 5411 考虑直接dp会T, 用矩阵优化一下就好了. #include<bits/stdc++.h> #define LL long long #define LD long ...
- 【矩阵快速幂】 HDU 5411 CRB and Puzzle 等比
点击打开链接 题意显然是 求 A+A^2+A^3+....+A^m 这就是经典题目 矩阵乘法十种经典题目 递归解决 后半部分提取 A^(m/2) 该题再特判下 m==1的时候 #include < ...
- HDU5411CRB and Puzzle(矩阵快速幂)
题目链接:传送门 题意: 一个图有n个顶点,已知邻接矩阵,问点可以重复用长度小于m的路径有多少. 分析: 首先我们知道了邻接矩阵A,那么A^k代表的就是长度为k的路径有多少个.那么结果就是A^0+A^ ...
最新文章
- PyTorch 入门实战
- 【STM32】STM32F4时钟系统
- 浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别
- 【JEECG技术文档】JEECG online 表单填值规则使用说明
- 设置log缓存_Redis中缓存击穿 缓存穿透 缓存雪崩解决方案
- linux设置环境变量_Linux怎么设置系统环境变量之export命令详解
- vue 百度统计_2021暑期实习面经百度篇
- TextureView实现视频播放
- 分布式架构之缓存系统
- 深入浅出工厂设计模式
- 服务器装系统后安装驱动失败,windows10系统下驱动人生安装驱动失败如何解决
- 10 款富有创意的博客名片设计
- 知识图谱从入门到应用——知识图谱的知识表示:向量表示方法
- 英语发音之音标4---长元音法()
- PostgreSQL,MongoDB,Neo4j,OrientDB和ArangoDB比较
- protoc did not exit cleanly. Review output for more information报错
- python字符串算式加减运算(Python字符串运算)
- 天刀各区服务器位置,天刀服务器人数统计2017 | 手游网游页游攻略大全
- 【三维路径规划】基于RRT实现三维路径规划matlab源码
- CSS入门(CSS常用属性----字体、对齐方式、display属性、浮动)
热门文章
- php的foreach循环执行过程分析以及循环中执行unset()的一些问题
- 【深度学习】深入浅出transformer解决并行计算问题
- 【Ubuntu入门到精通系列讲解】Ubuntu 图形界面入门
- 【Web安全】提权—使用中国菜刀和iis6.exe在目标服务器创建Administrators用户
- python【力扣LeetCode算法题库】13- 罗马数字转整数
- oracle SQL 命令行(二.视图)
- spring boot中@ResponseBody等注解的作用与区别
- 特斯拉“刹车失灵”不绝于耳网络营销外包怎样看特斯拉进驻中国?
- 如何有效建设网站外链?
- php判断手机浏览器,PHP环境下判断客户端是否为手机浏览器