ZJOI2005沼泽鳄鱼
矩阵优化dp
** 注意:矩阵乘法没有交换律 **
思路:类比P2151hh去散步
代码特点在一维的答案矩阵
1.矩阵优化两点间方案数不必赘述
2.注意2,3,4可以办到以他们的lcm为周期,正是因为如此我们可以矩阵加速(这样我们就可以化动为静,矩阵乘法了)
3.一维初始矩阵(一维邻接矩阵+第二个矩阵取交集)注意当前鳄鱼的位置与我们下一次走并无关,他们正好搓了一位,要小心
4.再次强调:矩阵乘法没有交换律:因此,我们在构造转移矩阵时要从2开始到12,再乘1(这里指的是矩阵)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,S,E,k,t,mod=10000;
int record[20][60],Map[60][60];
struct M{
int m[60][60];
M(){
memset(m,0,sizeof(m));
}
M operator *(const M &a)const {//重载定义矩阵乘法
M ret;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k)
ret.m[i][j]=(ret.m[i][j]+m[i][k]%mod*a.m[k][j]%mod)%mod;
return ret;
}
}c[20],e,A;
inline void build(){//构造转移矩阵
for(int i=1;i<=n;++i)e.m[i][i]=1;
for(int i=1;i<=12;++i){
for(int j=1;j<=n;++j){
for(int k=1;k<=n;++k){
if(Map[j][k]&&(!record[i][j]))c[i].m[k][j]=1;
}
}
}
for(int i=2;i<=12;i++)e=e*c[i];//矩乘没有交换律
e=e*c[1];//因为我们的第二个矩阵跟第一步有关,所以先乘2矩阵
}
inline void power(M &a,M &b,int k){
while(k){
if(k&1)a=a*b;
b=b*b;
k>>=1;
}
}//矩阵快速幂
inline void solve(){//极其繁琐需要头脑冷静
if(k==1){printf("%d",Map[S][E]);return ;}
for(int i=1;i<=n;++i)if(Map[S][i]&&c[2].m[S][i])A.m[S][i]=1;//先跟第二矩阵取交集,表示走第一步--此处表示构造初始矩阵
if(k<=12)for(int i=3;i<=k+1;++i)A=A*c[i%12];//此处分类讨论
else {//因为初始矩阵的存在,我们已经走了一步
for(int i=3;i<=12;++i)A=A*c[i];//所以在这里我们先暴力走一遍
A=A*c[1];//注意不能交换律
power(A,e,(k/12)-1);//先乘了一遍所以-1
for(int i=2;i<=(k-12)%12+1;++i)A=A*c[i];//最后再o再
}
printf("%d",A.m[S][E]);
}
int main(){
scanf("%d%d%d%d%d",&n,&m,&S,&E,&k);
S++,E++;//加1比较顺我的思路,下面的加1同
for(int i=1;i<=m;++i){
int x,y;
scanf("%d%d",&x,&y);
++x,++y;
Map[x][y]=1;
Map[y][x]=1;
}
scanf("%d",&t);
for(int i=1;i<=t;++i){
int num;
scanf("%d",&num);
for(int j=1;j<=num;++j){
int x;
scanf("%d",&x);
int k=j;
x++;
while(k<=12){
record[k][x]=1;
k+=num;
}//12一循环
}
}
build();
solve();
return 0;
}
ZJOI2005沼泽鳄鱼的更多相关文章
- 【BZOJ1898】[ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划)
[BZOJ1898][ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 先吐槽,说好了的鳄鱼呢,题面里面全是食人鱼 看到数据范围一眼想到矩乘. 先不考虑食人鱼的问题,直接 ...
- P2579 [ZJOI2005]沼泽鳄鱼(矩乘)
P2579 [ZJOI2005]沼泽鳄鱼 没有食人鱼:直接矩乘优化 有食人鱼:食人鱼周期2.3.4,公倍数12,可以以12为一个周期矩乘,剩下的暴力 注意矩乘不满足乘法交换律,一定要注意乘的顺序 #i ...
- 题解-[ZJOI2005]沼泽鳄鱼
题解-[ZJOI2005]沼泽鳄鱼 前置知识: 邻接矩阵 矩阵乘法 矩阵快速幂 [ZJOI2005]沼泽鳄鱼 给一个有 \(N\) 个点,\(M\) 条双向边的图 \(G\),其中有 \(NFish\ ...
- bzoj1898 [Zjoi2005]沼泽鳄鱼
Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几 ...
- [ZJOI2005]沼泽鳄鱼 矩阵乘法
---题面--- 题解: 乍一看还是挺懵逼的.和HH去散步很像,思路也是类似的. 复制一段我在HH去散步的题解里面写的一段话吧: 考虑f[i][j]表示i和j是否右边相连,有为1,否则为0,那么f同时 ...
- P2579 [ZJOI2005]沼泽鳄鱼
传送门 话说邻接矩阵居然还能快速幂的么-- 把原图的邻接矩阵\(G\)打出来,那么\(G[u][v]\)表示一秒后\(u\)到\(v\)的方案数,\(G^2[u][v]\)表示\(2\)秒后的方案数- ...
- [ZJOI2005]沼泽鳄鱼
题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥 ...
- [luogu2579 ZJOI2005] 沼泽鳄鱼(矩阵快速幂)
传送门 题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石 ...
- P2579 [ZJOI2005]沼泽鳄鱼(邻接矩阵,快速幂)
题目简洁明了(一点都不好伐) 照例,化简题目 给一张图,每一个时间点有一些点不能走,(有周期性),求从起点第k秒恰好在终点的方案数,可重复,不可停留. 额dp实锤 于是就被打脸了.... 有一种东西叫 ...
随机推荐
- IDL build
For Developers > Design Documents > IDL build 目录 1 Steps 2 GYP 3 Performance 3.1 Details ...
- 旧机器安装ArchLinux的各种问题
昨天突然想到家里还有一台很早之前不用的计算机 于是打算安装一个linux,开学再拿到宿舍用来写代码,怎么说台式机显示屏也比笔记本的大 机器安装问题 屏幕机箱擦干净,该连的东西都连上,然后插电源,本以为 ...
- cookie 实现记住用户名演示 通过代码迅速理解cookie
// 登录页 可直接 tomcat部署 测试 1 package com.itheima.login; import java.io.IOException; import java.io.Print ...
- Xshell查看日志的基础使用
2018\11\26 下载安装不多说,官网免费版即可,附上链接:https://www.netsarang.com/products/xsh_overview.html 打开后新建连接,输入主机ip即 ...
- linux命令find命令详解
find 查找文件 find 哪里 什么类型 什么名字 -maxdepth 最大的深度 查找目录的最大深度 find -maxdepth 1 -type d -type 找什么类型的 f fil ...
- 题解 P2872 【[USACO07DEC]道路建设Building Roads】
这道题真的是令人窒息,Kruskal调了贼久一直RE,最后发现数组大小稍微少了那么一点点.(也就10倍吧..) 言归正传,根据本人的分析(以及算法标签的提示),这是一道求最小生成树的题目,当然要注意已 ...
- ruby redis的集群管理器
#========================================================================================== # => ...
- [Python] Plotting multiple stocks
import os import pandas as pd import matplotlib.pyplot as plt def test_run(): start_date='2017-01-01 ...
- Function的一些结论与eval函数.
1.1 函数的创建方式 1 函数声明 2 函数表达式 3 new Function // 1 function foo() {} // 2 var foo = function() {}; // 3 ...
- 学习中 常用到的string内置对象方法的总结
//concat() – 将两个或多个字符的文本组合起来,返回一个新的字符串. var str = "Hello"; var out = str.concat(" Wor ...