题解-[ZJOI2005]沼泽鳄鱼

前置知识:

邻接矩阵

矩阵乘法

矩阵快速幂


[ZJOI2005]沼泽鳄鱼

给一个有 \(N\) 个点,\(M\) 条双向边的图 \(G\),其中有 \(NFish\) 只鳄鱼以 \(T\) 个点 \(P_0\sim P_t\) 为周期运动。求从 \(Start\) 出发到 \(End\) 不停留走 \(K\) 步每步不碰到鳄鱼的方案数(节点下标从 \(0\) 开始编号)。

数据范围:\(1\le N\le 50\),\(1\le K\le 2\times 10^9\),\(1\le NFish\le 20\),\(2\le T\le 4\)。


看到这个 \(K\) 的范围就知道要带个 \(\log\),而在图上可以带 \(\log\) 的算法,唯有二分、倍增(树形图)和邻接矩阵快速幂(小图)。看到这题 \(N\) 很小,又无从二分,便知道可以邻接矩阵快速幂


首先要知道什么是矩阵乘法。大小为 \(a\times b\) 的矩阵 \(A\) 和大小为 \(b\times c\) 的矩阵方可相乘,乘积矩阵 \(C\) 大小为 \(a\times c\),满足 \(C_{i,j}=\sum\limits_{k=1}^bA_{i,k}\cdot B_{k,j}(1\le i\le a,1\le j\le c)\)。

矩阵乘法可以解决集合的定向求和变换操作。其中原矩阵乘以变换矩阵变成目标矩阵。


矩阵快速幂:原矩阵多次定向变换,可以通过多次乘以变换矩阵解决。矩阵乘法满足结合律,所以可以先求出变换矩阵的幂。矩阵也可以快速幂,时间复杂度 \(\Theta(n^3\log k)\)。


邻接矩阵:用于表示图边,在无权图中,如果矩阵 \(M\) 的元素 \(M_{i,j}=1\),表示存在边 \((i,j)\)。


而邻接矩阵快速幂就是建立在邻接矩阵和矩阵快速幂上的。原矩阵表示起点状态,变换矩阵为邻接矩阵,每乘一次就表示不停留地走一步后的状态,乘 \(K\) 次就成了最终状态,取终点矩阵值则为答案。

状态:到每个节点的方案数。


Example

讲解时暂时初始下标为 \(1\) 吧,暂时不考虑鳄鱼。

例如 \(N=3\),\(Start=1\),\(End=3\),有双向边 \({(1,3),(3,2)}\),求走 \(K=3\) 步后到终点 \(End\) 的方案数。

原始状态:

\[A=
\begin{bmatrix}
1 & 0 & 0\\
\end{bmatrix}
\]

变换矩阵为邻接矩阵:

\[B=
\begin{bmatrix}
0 & 0 & 1\\
0 & 0 & 1\\
1 & 1 & 0\\
\end{bmatrix}
\]

目标状态:

\[\begin{split}
C=&A\times B^K\\
=&
\begin{bmatrix}
1 & 0 & 0\\
\end{bmatrix}
\times
\begin{bmatrix}
0 & 0 & 1\\
0 & 0 & 1\\
1 & 1 & 0\\
\end{bmatrix}
^3\\
=&
\begin{bmatrix}
1 & 0 & 0\\
\end{bmatrix}
\times
\begin{bmatrix}
0 & 0 & 2\\
0 & 0 & 2\\
2 & 2 & 0\\
\end{bmatrix}\\
=&
\begin{bmatrix}
0 & 0 & 2\\
\end{bmatrix}
\end{split}
\]

所以到终点 \(End=3\) 的方案数为 \(2\)。


但是鳄鱼怎么办呢?

可以发现 \(2\le T\le 4\),所以所有鳄鱼运动的总周期是 \(12\)。可以计算 \(12\) 种变换邻接矩阵,表示到每个周期时可以走的边。然后顺次相乘,求乘积的 \(\lfloor\frac K{12}\rfloor\) 次幂(可以用矩阵快速幂)乘以 前 \(\left(K\bmod 12\right)\) 种变换矩阵的乘积,就是总变换矩阵。用表示起点的原矩阵乘以总变换矩阵,即可得答案。

时间复杂度 \(\Theta(NFish+N^3\log K)\)(注意,\(NFish\) 为一个完整变量名)。


真的难讲,还是放代码吧。

Code

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //&Start
  4. #define inf 0x3f3f3f3f
  5. #define re register
  6. #define il inline
  7. #define hash unorded_map
  8. typedef long long lng;
  9. typedef unsigned long long ulng;
  10. typedef vector<int> veci;
  11. #define fo(i,st,xb,y) for(re int i=st;i xb;i y)
  12. //&Data
  13. #define N 50
  14. #define mod 10000
  15. int n,m,s,t,k,fish,p[25][12];
  16. //&Matrix
  17. struct Matrix{ //矩阵
  18. int arr[N+5][N+5];
  19. Matrix(re int op=0){
  20. memset(arr,0,sizeof arr);
  21. if(op==1) fo(i,1,<=N,++) arr[i][i]=1; //构造单位矩阵 E 满足 E*A=A*E=A
  22. }
  23. il int* operator[](re int x){return arr[x];}
  24. il friend Matrix operator*(re Matrix x,re Matrix y){
  25. re Matrix res;
  26. fo(k,1,<=N,++)fo(i,1,<=N,++)fo(j,1,<=N,++)
  27. (res[i][j]+=x[i][k]*y[k][j]%mod)%=mod;
  28. return res;
  29. }
  30. il void print(re char*s){
  31. puts(s);
  32. fo(i,1,<=n,++)fo(j,1,<=n,++)
  33. printf("%d%c",arr[i][j],"\n "[j<n]);
  34. }
  35. }st,e,g[12],all,ans;
  36. il Matrix Pow(re Matrix a,re int x){ //矩阵快速幂
  37. re Matrix res(1);
  38. for(;x;a=a*a,x>>=1)if(x&1) res=res*a;
  39. return res;
  40. }
  41. //&Main
  42. int main(){
  43. scanf("%d%d%d%d%d",&n,&m,&s,&t,&k);
  44. s++,t++,st[1][s]=1; //原矩阵
  45. fo(i,1,<=m,++){
  46. re int u,v;scanf("%d%d",&u,&v);
  47. e[u+1][v+1]=e[v+1][u+1]=1; //邻接矩阵
  48. }
  49. scanf("%d",&fish);
  50. fo(i,1,<=fish,++){
  51. re int tmp; scanf("%d",&tmp);
  52. fo(j,0,<tmp,++) scanf("%d",p[i]+j),p[i][j]++;
  53. fo(j,tmp,<12,++) p[i][j]=p[i][j%tmp];
  54. }
  55. re int fb[N+5];
  56. fo(i,0,<12,++){
  57. fill(fb+1,fb+n+1,0);
  58. fo(j,1,<=fish,++) fb[p[j][i]]=1;
  59. fo(j,1,<=n,++)fo(k,1,<=n,++)
  60. if(!fb[k]) g[i][j][k]=e[j][k]; //12种变换矩阵
  61. }
  62. all=Matrix(1);
  63. fo(i,1,<12,++) all=all*g[i];
  64. all=all*g[0]; //12个矩阵顺次相乘(1,2,...,11,0)
  65. ans=st*Pow(all,k/12); //原矩阵乘以变换矩阵
  66. fo(i,1,<=k%12,++) ans=ans*g[i]; //乘以剩余 K%12 个矩阵
  67. printf("%d\n",ans[1][t]); //答案
  68. return 0;
  69. }

祝大家学习愉快!

题解-[ZJOI2005]沼泽鳄鱼的更多相关文章

  1. 【BZOJ1898】[ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划)

    [BZOJ1898][ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 先吐槽,说好了的鳄鱼呢,题面里面全是食人鱼 看到数据范围一眼想到矩乘. 先不考虑食人鱼的问题,直接 ...

  2. P2579 [ZJOI2005]沼泽鳄鱼(矩乘)

    P2579 [ZJOI2005]沼泽鳄鱼 没有食人鱼:直接矩乘优化 有食人鱼:食人鱼周期2.3.4,公倍数12,可以以12为一个周期矩乘,剩下的暴力 注意矩乘不满足乘法交换律,一定要注意乘的顺序 #i ...

  3. [ZJOI2005]沼泽鳄鱼 矩阵乘法

    ---题面--- 题解: 乍一看还是挺懵逼的.和HH去散步很像,思路也是类似的. 复制一段我在HH去散步的题解里面写的一段话吧: 考虑f[i][j]表示i和j是否右边相连,有为1,否则为0,那么f同时 ...

  4. [ZJOI2005]沼泽鳄鱼

    题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥 ...

  5. [luogu2579 ZJOI2005] 沼泽鳄鱼(矩阵快速幂)

    传送门 题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石 ...

  6. bzoj1898 [Zjoi2005]沼泽鳄鱼

    Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几 ...

  7. P2579 [ZJOI2005]沼泽鳄鱼

    传送门 话说邻接矩阵居然还能快速幂的么-- 把原图的邻接矩阵\(G\)打出来,那么\(G[u][v]\)表示一秒后\(u\)到\(v\)的方案数,\(G^2[u][v]\)表示\(2\)秒后的方案数- ...

  8. ZJOI2005沼泽鳄鱼

    矩阵优化dp ** 注意:矩阵乘法没有交换律 ** 思路:类比P2151hh去散步 代码特点在一维的答案矩阵 1.矩阵优化两点间方案数不必赘述 2.注意2,3,4可以办到以他们的lcm为周期,正是因为 ...

  9. P2579 [ZJOI2005]沼泽鳄鱼(邻接矩阵,快速幂)

    题目简洁明了(一点都不好伐) 照例,化简题目 给一张图,每一个时间点有一些点不能走,(有周期性),求从起点第k秒恰好在终点的方案数,可重复,不可停留. 额dp实锤 于是就被打脸了.... 有一种东西叫 ...

随机推荐

  1. 机器学习3《数据集与k-近邻算法》

    机器学习数据类型: ●离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所 有这些数据全部都是整数,而且不能再细分,也不能进一步提高他们的精确度. ●连续型数据:交量可以在某个范围内取任 ...

  2. rados put striper功能的调试

    前言 之前对于striper这个地方的功能并没研究太多,只是知道这个里面可以以条带方式并行的去写对象,从而加大并发性来提高性能,而默认的条带数目为1,也就是以对象大小去写,并没有条带,所以不是很好感觉 ...

  3. JavaScript高级程序设计(第四版) -- 随笔 -- 数组(未完)

    数组方法 .every() 与 .some() 传给两个个方法的函数都接收3个参数:数组元素.元素索引和数组本身. .every() -- 对于每一项都需要返回true,它才会返回true 若中途有一 ...

  4. JLC PCB 嘉立创自动确认生产稿,不讲武德?耗子尾汁!!!

    首先,开局一张图,嘉立创又不做人的一天.嘉立创不讲武德,耗子尾汁!!! 之前下单,勾选了确定生产稿和不加客编,结果生产稿出来还是给我加了客编.那我出10元的意思何在?让我自己花3元看我花的10元有没有 ...

  5. 解决Ubuntu配置nginx出现的问题

    Ubuntu18.04配置nginx出现的各种错误 缺少pcre库 编译nginx 出现错误 安装pcre库,出现错误 手动编译安装pcre库 (1)下载并解压pcre库 wget https://f ...

  6. Mysql获取webshell方式总结

    select ... into outfile general_log cnblogs-MySQL获取webshell的几种方式 csdn-PhpMyadmin后台拿webshell方法总结

  7. 攻克弹唱第七课(如何弹奏neon)

    在本期文章中,笔者将通过Guitar Pro 7来跟大家研究一下neon的曲谱,顺便复习一下之前文章中说过的和弦技巧. 在<如何在指板上寻找特殊和弦(二)>这一期课程中,我们分析过如何使用 ...

  8. 使用QQ登陆

    到这里https://connect.qq.com,申请成为开发者,然后等着审核通过 通过了,创建网站应用,回调地址必须是备案成功的网站上的,然后等着审核通过 通过了,得到正确的appid和appke ...

  9. yii的pathinfo方式实现

    yii2.0在浏览器中默认查看控制器下的方法是  http://ltbk.cn/index.php?r=login/login 要是在浏览器上输出 http://ltbk.cn/index.php/l ...

  10. laradock使用问题汇总

    laradock简介 一套完整的基于Docker的PHP开发环境.包含了预先打包的Docker镜像,所有预先配置都是为了提供一个完美的PHP开发环境(中文文档).PS: 不是最新版的 windows1 ...