This article is made by Jason-Cow.
Welcome to reprint.
But please post the article's address.

BZOJ1898  Come  On

图上求路径数问题

随机地加入一些“鱼”,它们的变化有周期性,且周期为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的更多相关文章

  1. BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1898 题意概括 有一个无向图. 其中,有许多条鱼在以循环的规律出现,比如循环在1,2,3这些点出现 ...

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

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

  3. 【BZOJ1898】[Zjoi2005]Swamp 沼泽鳄鱼 矩阵乘法

    [BZOJ1898][Zjoi2005]Swamp 沼泽鳄鱼 Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎 ...

  4. 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1012  Solved: 566[Submit][S ...

  5. BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵快速幂)

    题意 题目链接 Sol 不难发现吃人鱼的运动每\(12s\)一个周期 所以暴力建12个矩阵,放在一起快速幂即可 最后余下的部分暴力乘 #include<bits/stdc++.h> usi ...

  6. bzoj1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 求到达方案数...还是矩阵快速幂: 能够到达就把邻接矩阵那里赋成1,有鳄鱼的地方从各处 ...

  7. BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵乘法)

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 Description 潘塔 ...

  8. BZOJ1898: [Zjoi2004]Swamp 沼泽鳄鱼

    1898: [Zjoi2004]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 478  Solved: 286[Submit][St ...

  9. C语言 · 矩阵乘法 · 算法训练

    问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...

随机推荐

  1. 书写makefile的注意点

    1.空格 定义一个变量时用“foo = 1”这种形式,1后面千万不可以有空格,否则,foo的值为“1 ”.等于号和1之间的空格有无,并没有关系. 2.ifeq ifeq的形式是“ifeq ($(foo ...

  2. java - GC垃圾收集器详解(一)

    概要 该图标记了在jdk体系中所使用到的垃圾收集器及对应的关系图.图片上方为年轻代的垃圾收集器而图片下方是老年代的垃圾收集器.当选择某一个区域的垃圾收集器时会自动选择另外一个区域的另一个垃圾收集器.例 ...

  3. php redis使用

    访问连接 远程访问 //实例化 $redis=new Redis(); try{ $redis->connect('47.98.55.11','6379'); $redis->auth(' ...

  4. the import javax.jms cannot be resolved问题

    JDK中并没有javax.jms包,你需要一个JMS实现(比如:activemq),并确认相应的jar被包含在CLASSPATH中. http://activemq.apache.org/ 5.5.0 ...

  5. 51Nod 1344 走格子 (贪心)

    有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去.机器人有一个初始能量,每个格子对应一个整数A[i],表示这个格子的能量值.如果A[i] > 0,机器 ...

  6. Struts2学习-jsp中超链接传参问题

    今天在学习过程中对struts2中超链接的传参问题产生了一些疑惑,不明白jsp中的超链接如何将参数传到Action方法中去的. <s:iterator value="categorys ...

  7. 申请一个美国paypal账户

    近期为了做PayPal支付,进口demo已经写好,就差一个美国PayPal账户进行支付测试,几经折腾,终于申请下来,附上参考链接:   paypal官网: https://www.paypal.com ...

  8. 回环屏障CyclicBarrier

    上一篇说的CountDownLatch是一个计数器,类似线程的join方法,但是有一个缺陷,就是当计数器的值到达0之后,再调用CountDownLatch的await和countDown方法就会立刻返 ...

  9. windows redis启动

    1.下载redis 2.启动redis 3.启动redis客户端并设置protected-mode为false

  10. 2019-08-17 纪中NOIP模拟B组

    T1 [JZOJ3503] 粉刷 题目描述 鸡腿想到了一个很高(sha)明(bi)的问题,墙可以看作一个N*M的矩阵,有一些格子是有污点的.现在鸡腿可以竖着刷一次,覆盖连续的最多C列,或者横着刷一次, ...