欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1898


题意概括

  有一个无向图。

  其中,有许多条鱼在以循环的规律出现,比如循环在1,2,3这些点出现。循环节长度=2,3,4 。

  现在,你要从A花费K个单位时间到达B,中途不能和鱼相碰,问有多少方案。

  (每个单位时间,鱼从当前的点走向循环中的下一个点)。

  n<=50,K<=2000000000


题解

  注意到循环节长度为2或3或4.

  如果不考虑鱼,那么就是简单的矩阵优化路径统计。可以看这个

  现在考虑鱼。

  那么就是对于某一时刻,某些鱼所在的位置的路径数都要清0 。

  我们发现循环接长度很小。最小公倍数为12!

  所以我们可以12个12个来。

  对于其中12个,我们大力dp。

  然后对于K/12,我们可以用矩阵快速幂解决。对于剩余的K%12,我们也可以再乘上一个矩阵。

  然后就搞定了。


代码

#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int N=50+5,M=N*N/2,F=20+5,T=5,LCM=12,mod=10000;
int n,m,st,en,K,ways[LCM+3][N][N];
bool loc[N][LCM+3],g[N][N];
struct Mat{
int v[N][N];
void set(int x){
memset(v,0,sizeof v);
if (x!=1)
return;
for (int i=1;i<=n;i++)
v[i][i]=1;
}
Mat operator * (Mat x){
Mat ans;
ans.set(0);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=n;k++)
ans.v[i][j]=(ans.v[i][j]+v[i][k]*x.v[k][j])%mod;
return ans;
}
}M0,M1,M2,M3;
Mat MatPow(Mat x,int y){
Mat ans,now=x;
ans.set(1);
while (y){
if (y&1)
ans=ans*now;
now=now*now;
y>>=1;
}
return ans;
}
void Get_Loc(){
int Nfish,t,a[5];
scanf("%d",&Nfish);
memset(loc,0,sizeof loc);
while (Nfish--){
scanf("%d",&t);
for (int i=1;i<=t;i++)
scanf("%d",&a[i]),a[i]++;
for (int i=1;i<=12;i++)
loc[a[i%t+1]][i]=1;
}
}
int main(){
scanf("%d%d%d%d%d",&n,&m,&st,&en,&K),st++,en++;
memset(g,0,sizeof g);
for (int i=1,a,b;i<=m;i++){
scanf("%d%d",&a,&b),a++,b++;
g[a][b]=g[b][a]=1;
}
Get_Loc();
for (int i=1;i<=n;i++)
ways[0][i][i]=1;
for (int t=1;t<=12;t++){
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=n;k++)
if (g[j][k])
ways[t][i][k]=(ways[t][i][k]+ways[t-1][i][j])%mod;
for (int i=1;i<=n;i++)
if (loc[i][t])
for (int j=1;j<=n;j++)
ways[t][j][i]=0;
}
M0.set(0),M2.set(0);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
M0.v[i][j]=ways[12][i][j],M2.v[i][j]=ways[K%12][i][j];
M1=MatPow(M0,K/12);
M3=M1*M2;
printf("%d",M3.v[st][en]);
return 0;
}

  

BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼 [矩阵乘法]

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

  7. bzoj1898: [Zjoi2005]Swamp 沼泽鳄鱼

    一眼矩乘 把图分成12个,然后直接搞. #include<cstdio> #include<iostream> #include<cstring> #include ...

  8. bzoj 1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 当然是邻接矩阵做转移矩阵来快速幂. 对于鳄鱼,好在它们周期的lcm是12,也就是每12 ...

  9. 1898: [Zjoi2005]Swamp 沼泽鳄鱼

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1582 Solved: 870 [Submit][S ...

随机推荐

  1. xml的解析方式的简介

    xml的解析的简介(写到java代码) *xml是一个标记型文档 *js使用dom解析标记型文档? -根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象 -do ...

  2. 在html中控制自动换行

      其实只要在表格控制中添加一句<td style="word-break:break-all">就搞定了.其中可能对英文换行可能会分开一个单词问题:解决如下:语法: ...

  3. sql 分页row_number() over(order by key)

    select * from ( select row_number() over(order by BD008_001) as row ,* from (select * from bd008)t ) ...

  4. 如何在同一台服务器上部署两个tomcat

    因为测试的需要,有时我们必须在同一个服务器上部署两个tomcat,然后去做应用的部署,那么很多同学可能会觉得比较为难,找的资料也比较的不齐全,那么今天华华就来给大家讲讲如何部署2个tomcat,并能够 ...

  5. B - 低阶入门膜法 - D-query (查询区间内有多少不同的数)

    题目链接:https://cn.vjudge.net/contest/284294#problem/B 题目大意:查询区间内有多少个不相同的数. 具体思路:主席树的做法,主席树的基础做法是查询区间第k ...

  6. html 速查表

    HTML 速查列表 HTML 速查列表. 你可以打印它,以备日常使用. HTML 基本文档 <!DOCTYPE html> <html> <head> <ti ...

  7. FPN 学习笔记

    通常,利用网络对物体进行检测时,浅层网络分辨率高,学到的是图片的细节特征,深层网络,分辨率低,学到的更多的是语义特征. 1).通常的CNN使用如下图中显示的网络,使用最后一层特征图进行预测 例如VGG ...

  8. SpringAOP深入学习

    ----------------------Spring AOP介绍------------------ 1.编程范式概念 面向过程编程:C 面向对象编程:c++,Java 函数式编程 事件驱动编程: ...

  9. Jetson tk1 刷机教程

    前期准备: 1.  Jetson TK1开发板. 2.  安装有ubuntu系统的PC(或者ubuntu虚拟机)切记:不管是PC还是虚拟机,务必确保有大于5G的存储空间,之后安装过程会作详细解释. 3 ...

  10. 恶意代码分析实战-启动一个恶意的DLL

    如果不能把恶意代码运行起来,那么动态分析基础技术没有什么用. Windows版本中包含rundll32.exe程序,提供了一个运行DLL的平台. rundll32.exe Dllname,Export ...