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 ...
随机推荐
- Java基础编程题——分别统计出其中汉字、英文字母、空格、数字和其它字符的个数
package com.yangzl.basic; import java.util.Scanner; /** * 分别统计出其中汉字.英文字母.空格.数字和其它字符的个数 * @author Adm ...
- android 不同Activity之间数据传递
1. 传值Activity package mydemo.mycom.demo2; import android.content.Intent; import android.support.v7.a ...
- Elaticsearch 集群
elasticsearch开源的搜索引擎: ElasticSearch 个基于Lucene的搜索服务器:可以使用多节点的备份:集群设置: (类似是个数据库型.有索引有什么的).(lucene apa ...
- Centos 6.5 安装Python 3.7
文档下载地址: https://files.cnblogs.com/files/flashBoxer/Centos6.5%E5%AE%89%E8%A3%85Python3.7.xml
- 出现fonts/fontawesome-webfont.woff?v=4.5.0 net::ERR_ABORTED
虽然网页正常显示和运行,但是有2个字体文件出现404错误. 原因:服务器没有配置MIME类型而已. 1. 在IIS网站中,找打网站对应的MIME类型,双击. 2.能看到此网站对应的MIME类型,点击右 ...
- JavaScript练习 - 正反选练习
正反选练习 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- python - isinstance/issubclass 函数
#isinstance(obj,cls) #检查是否obj是否是object的类cls的对象 #判断一个对象是否是一个类的实例 class F00(object): pass obj = F00() ...
- nginx入门二
反向代理: proxy_pass server { listen 80; location /n { proxy_pass http://127.0.0.1:8000/test; } location ...
- python3爬虫二
1.获取列表页文章url集合: scrapy shell http://blog.jobbole.com/all-posts/ response.css('div.post-meta a.archiv ...
- ubuntu14.04 下安装 gsl 科学计算库
GSL(GNU Scientific Library)作为三大科学计算库之一,除了涵盖基本的线性代数,微分方程,积分,随机数,组合数,方程求根,多项式求根,排序等,还有模拟退火,快速傅里叶变换,小波, ...