矩阵-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 ...
随机推荐
- [Python]爬取CSDN论坛 标题 2020.2.8
首先新建一个Lei.txt 内容为: CloudComputingParentBlockchainTechnologyEnterpriseDotNETJavaWebDevelopVCVBDelphiB ...
- 杭电oj_2047——阿牛的EOF牛肉串(java实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2047 思路:先是列出了四个,但是没发现规律,然后开始画递归树,在其中找到了规律,算出递归式为f(n) ...
- phpstorm格式化数组
如果我们想要的这样的数组格式的话,可以设置 <?php $arr = array["a" => 0, "b" => 1, "c&qu ...
- python 音频可视化
代码整理好放在 github 上了: https://github.com/darkchii/visualize bilibili 演示视频:https://www.bilibili.com/vide ...
- Hackintosh相关资源站
猫叔博客 https://www.maoshu.cc/ 大神RehabMan https://bitbucket.org/RehabMan/ dsdt/ssdt打补丁译文 https://blog.c ...
- Windows系统对拍程序
Windows系统对拍程序,其中包含c++11用法,请使用c++11标准编译.此对拍程序会在发现错误时显示错误行号以及对应内容,方便比对. 此对拍程序自动使用g++对源代码进行编译.如果出现找不到g+ ...
- C语言sprintf函数的深入理解
由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出.这也导致sprintf比printf有用得多.所以本文着重介绍sprintf, ...
- Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) C Messy
//因为可以反转n次 所以可以得到任何可以构成的序列 #include<iostream> #include<string> #include<vector> us ...
- Django | mysql修改个别表后save()报错
报错内容: elasticsearch.exceptions.ConnectionError: ConnectionError(<urllib3.connection.HTTPConnectio ...
- HTML5使用JavaScript控制<audio>音频的播放
1.播放音乐最简单的样例 <audio controls> <source src="horse.mp3" type="audio/mpeg" ...