矩阵-bzoj1898
This article is made by Jason-Cow.
Welcome to reprint.
But please post the article's address.
图上求路径数问题
随机地加入一些“鱼”,它们的变化有周期性,且周期为2,3或4
人不可与“鱼”共处一个柱子,问从S->T恰好经过K步的方案数
很容易想到BFS,但是K太大
观察到lcm(2,3,4)=12
所以可以用矩阵存储,求出转移矩阵,然后快速幂加速
Ans=A[]^(K/)
然后对于剩下的K%12累乘过去
Ans=Ans*A[i]
题目里有一些板子,总结一下,可以备用
1.矩阵乘法,忽略 “ +0 ”
Matrix operator*(Matrix A,Matrix B){
Matrix C;
for(int k=;k<=N;k++)
for(int i=;i<=N;i++)
if(A.a[i][k])
for(int j=;j<=N;j++)
if(B.a[k][j])
(C.a[i][j]+=(A.a[i][k]*B.a[k][j])%MOD)%=MOD;
return C;
}
2.矩阵快速幂,基于“ * ”
Matrix operator^(Matrix A,int b){
Matrix ans;for(int i=;i<=N;i++)ans.a[i][i]=;
for(;b;A=A*A,b>>=)if(b&)ans=ans*A;
return ans;
}
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
inline int _(){
int ans=;char x=getchar();bool f=;
while(x<''||x>''){if(x=='-')f=;x=getchar();}
while(x>=''&&x<='')ans=ans*+x-'',x=getchar();
return f?-ans:ans;
}
const int MOD=,SZ=;
int N,M,S,T,K,F,f[][],t[];
struct Matrix{
int a[SZ][SZ];
Matrix(){memset(a,,sizeof(a));}
}A[],Ans;
Matrix operator*(Matrix A,Matrix B){
Matrix C;
for(int k=;k<=N;k++)
for(int i=;i<=N;i++)
if(A.a[i][k])
for(int j=;j<=N;j++)
if(B.a[k][j])
(C.a[i][j]+=(A.a[i][k]*B.a[k][j])%MOD)%=MOD;
return C;
}
Matrix operator^(Matrix A,int b){
Matrix ans;for(int i=;i<=N;i++)ans.a[i][i]=;
for(;b;A=A*A,b>>=)if(b&)ans=ans*A;
return ans;
}
int main(){
N=_(),M=_(),S=_()+,T=_()+,K=_();
int i,j,k,x,y;
for(i=;i<=M;i++)
for(x=_()+,y=_()+,j=;j<=;j++)A[j].a[x][y]=A[j].a[y][x]=; for(F=_(),i=;i<=F;i++)
for(j=,t[i]=_();j<=t[i];j++)f[i][j]=_()+; for(i=;i<=F;i++)
for(j=;j<=;j++)
for(k=,x=f[i][j%t[i]+];k<=N;k++)
A[j].a[k][x]=; for(i=;i<=N ;i++)A[].a[i][i]=;
for(i=;i<=;i++)A[]=A[]*A[i];
Ans=A[]^(K/);
for(i=;i<=K%;i++)Ans=Ans*A[i];
printf("%d\n",Ans.a[S][T]);
return ;
}
矩阵-bzoj1898的更多相关文章
- BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1898 题意概括 有一个无向图. 其中,有许多条鱼在以循环的规律出现,比如循环在1,2,3这些点出现 ...
- 【BZOJ1898】[ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划)
[BZOJ1898][ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 先吐槽,说好了的鳄鱼呢,题面里面全是食人鱼 看到数据范围一眼想到矩乘. 先不考虑食人鱼的问题,直接 ...
- 【BZOJ1898】[Zjoi2005]Swamp 沼泽鳄鱼 矩阵乘法
[BZOJ1898][Zjoi2005]Swamp 沼泽鳄鱼 Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎 ...
- 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1012 Solved: 566[Submit][S ...
- BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵快速幂)
题意 题目链接 Sol 不难发现吃人鱼的运动每\(12s\)一个周期 所以暴力建12个矩阵,放在一起快速幂即可 最后余下的部分暴力乘 #include<bits/stdc++.h> usi ...
- bzoj1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 求到达方案数...还是矩阵快速幂: 能够到达就把邻接矩阵那里赋成1,有鳄鱼的地方从各处 ...
- BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵乘法)
1898: [Zjoi2005]Swamp 沼泽鳄鱼 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 Description 潘塔 ...
- BZOJ1898: [Zjoi2004]Swamp 沼泽鳄鱼
1898: [Zjoi2004]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 478 Solved: 286[Submit][St ...
- C语言 · 矩阵乘法 · 算法训练
问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...
随机推荐
- reids中删除某个前缀的所有key
需求:reids中删除某个前缀的所有key 说明:代码中的0:2标识从key前缀中截取前2个字符,这里示例的时候比如“b_”前缀,使用时候根据实际情况截取对应的长度进行判断即可. 生成测试数据 #!/ ...
- vjudge 棋盘
原题目链接:https://vjudge.net/contest/331118#problem/B 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放 ...
- Trie树相关博客
1. c++代码实现,包含删除操作:https://www.cnblogs.com/luxiaoxun/archive/2012/09/03/2668611.html 2. 一种典型实现及简单分析:h ...
- 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.21.1.10-加-6.4)Atomic_Operations
5.21.1.10 Write Atomicity Normal 这个特性控制AWUN和NAWUN参数的操作.设置的属性值在set Feature命令的Dword 11中表明. 如果提交Get Fea ...
- Python-Django学习笔记(三)-Model模型的编写以及Oracle数据库的配置
Django使用的 MTV 设计模式(Models.Templates.Views) 因此本节将围绕这三部分并按照这个顺序来创建第一个页面 模型层models.py 模型是数据唯一而且准确的信息来源. ...
- 论文阅读笔记(二)【IJCAI2016】:Video-Based Person Re-Identification by Simultaneously Learning Intra-Video and Inter-Video Distance Metrics
摘要 (1)方法: 面对不同行人视频之间和同一个行人视频内部的变化,提出视频间和视频内距离同时学习方法(SI2DL). (2)模型: 视频内(intra-vedio)距离矩阵:使得同一个视频更紧凑: ...
- Pycharm常用快捷捷捷啊键= =
超多快捷键的其实,懒得都记住(主要是记不住……) 这里记录一下自己觉得用了确实会很省事的,特别是当你没有鼠标的时候 = = 超常用的 Ctrl + / 注释该行 Ctrl + D 复制该行到下一行 ...
- 页面内容不满屏幕高度时,footer底部显示
底部高度固定的情况下 <style> body,html{ height: 100%; margin: 0; } .content{ min-height: 100%; padding-b ...
- JS高级---数组和伪数组
数组和伪数组 伪数组和数组的区别 真数组的长度是可变的 伪数组的长度不可变 function f1() { var sum = 0; for (var i = 0; i < arguments ...
- 出现“无法在发送 HTTP 标头之后进行重定向”问题
如题,在Response.Redirect之后会偶尔出现“无法在发送HTTP标头之后进行重定向”问题. 是因为,已经在出现错误的代码之前进行过一次重定向了.仔细检查代码即可. 解决方法:按照逻辑移除多 ...