BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵
欢迎访问~原文出处——博客园-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 沼泽鳄鱼 矩阵的更多相关文章
- 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 沼泽鳄鱼 矩阵乘法
[BZOJ1898][Zjoi2005]Swamp 沼泽鳄鱼 Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎 ...
- BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵乘法)
1898: [Zjoi2005]Swamp 沼泽鳄鱼 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 Description 潘塔 ...
- 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1012 Solved: 566[Submit][S ...
- BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼 [矩阵乘法]
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1082 Solved: 602[Submit][S ...
- bzoj1898: [Zjoi2005]Swamp 沼泽鳄鱼
一眼矩乘 把图分成12个,然后直接搞. #include<cstdio> #include<iostream> #include<cstring> #include ...
- bzoj 1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 当然是邻接矩阵做转移矩阵来快速幂. 对于鳄鱼,好在它们周期的lcm是12,也就是每12 ...
- 1898: [Zjoi2005]Swamp 沼泽鳄鱼
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1582 Solved: 870 [Submit][S ...
随机推荐
- luogu P3760 [TJOI2017]异或和
传送门 对于每个二进制位考虑有多少区间和这一位上为1 从前往后扫每个前缀和,如果当前这个前缀和某一个二进制位上为1,因为区间和由这个前缀和减去前面的前缀和得来,如果减去了这一位为0的前缀和,那么 减去 ...
- jira7.3.6添加导出excel的按钮
在 jira的application-data 文件夹下 jira-config.properties 文件(如果没有就创建一个) 中添加以下内容:jira.export.excel.enabled= ...
- magelinux(0111)
Web Service 应用层:http, https 实现某类具体应用: 传输层协议:TCP, UDP, SCTP IANA: 0-1023:众所周知,永久地分配给固定的应用使用,特权端口: 102 ...
- mysql 原理 ~ change buffer
一 简介:今天咱们来聊聊mysql的change buffer二 详细说明 1 +-change Buffer和数据页一样,也是物理页的一个组成部分,数据结构也是一颗B+树,这棵B+树放在共享表空 ...
- python - 用类写装饰器
这里用到了__call__的class内置参数 #类装饰器: class zsq(): #本质是定义一个参数,让装饰的主题传递至__call__方法内部 def __init__(self,obj): ...
- Attempting to badge the application icon but haven't received permission from the user to badge the application错误解决办法
今天刚刚学习UIApplication对象,当我希望利用这个对象在我们的应用图标上显示个数字的时候,xcode报了这个错误: 解决办法 : - (IBAction)applicationClicke ...
- 2017/05/07 java 基础 随笔
1.^异或 逻辑运算符 两边相同为false 不同为ture 2.键盘录入 package com.huawei; /** * 键盘录入 * @author Eric * */ import j ...
- 【网络编程1】网络编程基础-TCP、UDP编程
网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...
- unbuntu 16.04.2 安装 Eclipse C++开发环境
1.安装JAVA (1)首先添加源: sudo gedit /etc/apt/sources.list 在打开的文件中添加如下内容并保存: deb http://ppa.launchpad.net/w ...
- 转载:Java中的字符串常量池详细介绍
引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...