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实锤 于是就被打脸了.... 有一种东西叫 ...
随机推荐
- jdk--rpm.bin文件安装, zip解压与创建
3,执行命令赋予安装文件777权限: # cd /usr/java(mkdir java –此目录需要创建) ①jdk-1_5_0_16-linux-i586-rpm.bin文件安装 # chmod ...
- v2.0版本小程序开发心得(代码之外)
总结一些代码之外的事情: 做优先该做的事情 分清主次,一天只有24小时,人的精力也是有限的,而且经常性的是,在某个时间爆发性的产生了大量的问题.这些问题集中的产生,需要一个一个的解决,但是人的精力是有 ...
- BZOJ 2724 [Violet 6]蒲公英(分块)
题意 在线区间众数 思路 预处理出 f[i][j] 即从第 i 块到第 j 块的答案.对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数.每次询问的 ...
- luoguP1401 城市(二分答案+最大流)
题意 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能重复 ...
- Java基础学习总结(25)——Log4j快速入门教程
log4j是一个优秀的日志组件,基本上所有的java开发项目都会用到它.下面将自己学习的一些心得总结一下,方便以后学习. log4j在项目中都不会单独使用,至少是我写过的java项目中没有.一般来说l ...
- 【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿
[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时 ...
- openssl之BIO系列之6---BIO的IO操作函数
BIO的IO操作函数 ---依据openssl doc/crypto/bio/bio_read.pod翻译和自己的理解写成 (作者:DragonKing Mail:wzhah ...
- Jsoncpp使用具体解释以及链接问题解决
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写. 同一时候也易于机器解析和生成. 它基于JavaScript Programming ...
- 《AndroidStudio每日一贴》11. 重构之提炼为常量
提炼为常量是从暂时变量高速提炼出静态常量,这也是我们经常使用的重构手段. 很多其它有用技巧请查看<AndroidStudio有用指南> 操作步骤: ➤ 菜单条: Refactor -> ...
- CentOS6 安装 aria2
CentOS6 安装 aria2 https://www.jianshu.com/p/31ea7aba5524 http://blog.51cto.com/skypegnu1/1637168 1.先安 ...