[ZJOI2005]沼泽鳄鱼 矩阵乘法
题解:
乍一看还是挺懵逼的。和HH去散步很像,思路也是类似的。
复制一段我在HH去散步的题解里面写的一段话吧:
考虑f[i][j]表示i和j是否右边相连,有为1,否则为0,那么f同时可以表示从每个点出发走一步到其他点的方案数。
于是用一个和f长得一模一样的矩阵g来表示从每个点出发到其他点的方案数。
那么考虑g如何转移。
其实只要用g*f就可以表示一次转移了。
为什么?
设当前转移到了第t次,则g[i][j]表示i到j走t-1次的方案数(因为还没有更新)
那么矩阵乘法做了什么?
$g[i][j] = \sum_{l = 1}^{n}{g[i][l] * f[l][i]}$
也就是它枚举了点i走了t - 1次到l,然后再从l走一次到j的方案数。
是否能转移则要看l 到 j是否有边,而f[l][j]的意义刚好就是这样。
但这题有一些特殊的限制,就是会有食人鱼周期性的游动。
这样的话,转移就不再是一成不变的了,而是每天都有不同的不能去的地方,这样的话直接矩阵加速就做不了了。
但是暴力做矩阵乘法还是对的,因为这里的矩阵乘法实际上就是做一次DP
那么如何解决这个问题呢?
观察到题目给的一个特殊性质:周期只有2,3,4三种。gcd(2, 3, 4) = 12.这意味着每过12天,每天可走的路线又会与12天前重复。
所以如果我们把12天缩成1天,那么每天可走的路就是固定的了。
因此我们预处理出这12天每天可以走的路线,然后暴力转移12次,把12天的矩阵都浓缩成1个,然后再做矩阵乘法即可。
因为我们已经把12天缩成1天了,因此我们要乘的次数也变为了12分之一。
然后剩下的不能被12整除的天数就在末尾暴力乘即可。
由于矩阵乘法没有交换律,因此在暴力乘的过程中要格外注意顺序问题。
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 52
#define mod 10000 int n, m, s, t, k, num;
int g[AC][AC], go[AC][AC];//g记录连边情况,go表示第i条鱼,j时刻在哪 struct matrix{
int s[AC][AC];
}ans, f, p[], box; inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} matrix cal(matrix x, matrix y)
{
for(R i = ; i <= n; i ++)
for(R j = ; j <= n; j ++)
{
box.s[i][j] = ;
for(R l = ; l <= n; l ++)
box.s[i][j] = (box.s[i][j] + x.s[i][l] * y.s[l][j]) % mod;
}
return box;
} inline void pre()
{
int a, b, T;
n = read(), m = read(), s = read() + , t = read() + , k = read();
for(R i = ; i <= m; i ++)//读入桥
{
a = read() + , b = read() + ;
g[a][b] = g[b][a] = ;
}
num = read();
for(R i = ; i <= num; i ++)//读入鱼
{
T = read();
for(R j = ; j < T; j ++) go[i][j] = read() + ;
for(R j = T; j < ; j ++) go[i][j] = go[i][j - T];
}
} void qpow(int have)
{
if(have <= ) return ;
while(have)
{
if(have & ) ans = cal(ans, f);
f = cal(f, f);
have >>= ;
}
} void work()
{
for(R i = ; i <= ; i ++)//枚举时刻
{
for(R j = ; j <= n; j ++)//枚举石墩
for(R l = ; l <= n; l ++) p[i].s[j][l] = g[j][l];
for(R j = ; j <= num; j ++)//枚举鱼
{
int x = go[j][i];//获取这条鱼在这个时刻在哪里
for(R l = ; l <= n; l ++) p[i].s[l][x] = ;//枚举从哪个石墩来到x
}
}
if(k <= )
{
ans = p[];
for(R i = ; i <= min(k, ); i ++) ans = cal(ans, p[i]);
if(k == ) ans = cal(ans, p[]);
printf("%d\n", ans.s[s][t]);
return ;
}
ans = p[];
for(R i = ; i <= ; i ++) ans = cal(ans, p[i]);
ans = cal(ans, p[]);
f = ans;
qpow(k / - );//因为有一个1在ans那
int b = k % ;
for(R i = ; i <= b; i ++) ans = cal(ans, p[i]);
printf("%d\n", ans.s[s][t]);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
work();
// fclose(stdin);
return ;
}
[ZJOI2005]沼泽鳄鱼 矩阵乘法的更多相关文章
- 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1012 Solved: 566[Submit][S ...
- BZOJ 1898: [Zjoi2004]Swamp 沼泽鳄鱼(矩阵乘法)
可以发现,如果没有鳄鱼,那么就是裸地一道题,但是可以发现鳄鱼最多每12次重复,那么就少于12的那部分dp,其他的就矩阵乘法就行了 PS:第一次吧矩阵乘法AC了好开心QAQ CODE: #include ...
- [luogu2579 ZJOI2005] 沼泽鳄鱼(矩阵快速幂)
传送门 题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石 ...
- BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼 [矩阵乘法]
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1082 Solved: 602[Submit][S ...
- 【BZOJ1898】[Zjoi2005]Swamp 沼泽鳄鱼 矩阵乘法
[BZOJ1898][Zjoi2005]Swamp 沼泽鳄鱼 Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎 ...
- 【BZOJ1898】[ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划)
[BZOJ1898][ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 先吐槽,说好了的鳄鱼呢,题面里面全是食人鱼 看到数据范围一眼想到矩乘. 先不考虑食人鱼的问题,直接 ...
- 题解-[ZJOI2005]沼泽鳄鱼
题解-[ZJOI2005]沼泽鳄鱼 前置知识: 邻接矩阵 矩阵乘法 矩阵快速幂 [ZJOI2005]沼泽鳄鱼 给一个有 \(N\) 个点,\(M\) 条双向边的图 \(G\),其中有 \(NFish\ ...
- *HDU2254 矩阵乘法
奥运 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...
- *HDU 1757 矩阵乘法
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
随机推荐
- SQL中EXCEPT函数在 Mysql 和 sqlServer 中的替代方法
示例摘自:极客代码:http://wiki.jikexueyuan.com/project/sql/useful-functions/except-clause.html EXCEPT 子句 EXCE ...
- c#winform使用WebBrowser 大全
C# WinForm WebBrowser (一) MSDN资料 1.主要用途:使用户可以在窗体中导航网页. 2.注意:WebBrowser 控件会占用大量资源.使用完该控件后一定要调用 Dispos ...
- redis搭建
redis 1.简介.安装 Remote Dictionary Server(Redis)是一个基于 key-value 键值对的持久化数据库存储系统.redis 和 Memcached 缓存服务很像 ...
- Hadoop(17)-MapReduce框架原理-MapReduce流程,Shuffle机制,Partition分区
MapReduce工作流程 1.准备待处理文件 2.job提交前生成一个处理规划 3.将切片信息job.split,配置信息job.xml和我们自己写的jar包交给yarn 4.yarn根据切片规划计 ...
- HDU暑假多校第八场G-Card Game
一.题意 给出N个卡牌,卡牌的正反两面具有两个数字,取值范围为[1,2*n],给出若干个默认正面向上的卡牌,求最小反转多少张卡牌可以使得,每张卡牌朝上的面上都有一个不同的数字,同时满足最小反转次数的反 ...
- Spring 的好处?
1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监 ...
- ssrf小记
SSRF(Server-Side Request Forgery, 服务端请求伪造),攻击者伪造服务端发起的请求并执行,从而获得一些数据或进行攻击 一.危害 1.对内网的端口和服务进行扫描,对主机本地 ...
- Linux的系统安全设置Shell脚本
#!/bin/sh # desc: setup linux system security # powered by www.lvtao.net #account setup passwd -l xf ...
- 【C#】 语法糖
[C#] 语法糖 一, 扩展方法 1. 对某个类功能上的扩展 2. 特点: 使用方便,可以在不修改原代码的基础上进行扩展. 参照 linq,linq 就是一系列的扩展方法 3. 语法: 非泛型静态类, ...
- fiddler抓包工具的基本使用
fiddler是基于C#的HTTP抓包工具. fiddler的原理: fiddler是http代理服务器,它会抓取浏览器向服务器发送的HTTP请求,然后在将该请求发送到服务器.再获取从服务器返回的请求 ...