~~~题面~~~

题解:

  乍一看还是挺懵逼的。和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]沼泽鳄鱼 矩阵乘法的更多相关文章

  1. 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1012  Solved: 566[Submit][S ...

  2. BZOJ 1898: [Zjoi2004]Swamp 沼泽鳄鱼(矩阵乘法)

    可以发现,如果没有鳄鱼,那么就是裸地一道题,但是可以发现鳄鱼最多每12次重复,那么就少于12的那部分dp,其他的就矩阵乘法就行了 PS:第一次吧矩阵乘法AC了好开心QAQ CODE: #include ...

  3. [luogu2579 ZJOI2005] 沼泽鳄鱼(矩阵快速幂)

    传送门 题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石 ...

  4. BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼 [矩阵乘法]

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1082  Solved: 602[Submit][S ...

  5. 【BZOJ1898】[Zjoi2005]Swamp 沼泽鳄鱼 矩阵乘法

    [BZOJ1898][Zjoi2005]Swamp 沼泽鳄鱼 Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎 ...

  6. 【BZOJ1898】[ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划)

    [BZOJ1898][ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 先吐槽,说好了的鳄鱼呢,题面里面全是食人鱼 看到数据范围一眼想到矩乘. 先不考虑食人鱼的问题,直接 ...

  7. 题解-[ZJOI2005]沼泽鳄鱼

    题解-[ZJOI2005]沼泽鳄鱼 前置知识: 邻接矩阵 矩阵乘法 矩阵快速幂 [ZJOI2005]沼泽鳄鱼 给一个有 \(N\) 个点,\(M\) 条双向边的图 \(G\),其中有 \(NFish\ ...

  8. *HDU2254 矩阵乘法

    奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  9. *HDU 1757 矩阵乘法

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

随机推荐

  1. 进一步理解 frame 和 bounds

    总结一下 iOS中 frame 和 bounds之间的区别    综述 frame和bounds都是描述一块矩形区域,但是他们是有区别的 frame:可视范围,可以理解为控件的大小,把控件当作边缘很薄 ...

  2. 课时102.CSS精灵图(掌握)

    我们这节课来介绍一个和背景图片相关的东西,精灵图 1.设么是css精灵图? css精灵图是一种图像合成技术 2.css精灵图作用 可以减少请求的次数,以及可以降低服务器处理压力 3.如何使用css精灵 ...

  3. mybatis报错:sql中有条件语句时出现属性没有getter的异常

    Mybatis问题:在使用条件语句动态设置SQL语句时出现如下错误 Caused by: org.apache.ibatis.reflection.ReflectionException: There ...

  4. ECSHOP和SHOPEX快递单号查询顺丰插件V8.6专版

    发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...

  5. Hive初识(二)

    Hive分区 Hive组织表到分区.它是将一个表到基于分区列,如日期,城市和部门的值相关方式.使用分区,很容易对数据进行部分查询. 表或分区是细分成桶,以提供额外的结构,可以使用更高效的查询的数据.桶 ...

  6. 移植Linux Kernel SM750 驱动到VxWorks 7

    一.SM750简介 SM750 是SiliconMotion 推出的一款适合嵌入式设备的显卡(Embedded GPU),采用PCIe接口与CPU连接,内部集成16MB DDR SDRAM显存,产品具 ...

  7. ruby Dir类

    类方法 1. Dir[pat]    Dir::glob( pat) 返回一个数组,包含与指定的通配符模式 pat 匹配的文件名: * - 匹配包含 null 字符串的任意字符串 ** - 递归地匹配 ...

  8. ecshop 漏洞如何修复 补丁升级与安全修复详情

    目前ecshop漏洞大面积爆发,包括最新版的ecshop 3.0,ecshop 4.0,ecshop2.7.3全系列版本都存在着高危网站漏洞,导致网站被黑,被篡改,被挂马,许多商城系统深受其漏洞的攻击 ...

  9. stm32+lwip(五):以太网帧发送测试

    我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...

  10. HyperLedger Fabric 1.4 交易流程(6.3)

    区块链最主要的特性之一是去中心化,没有了中心机构的集中处理,为了达成数据的一致性,就需要网络中全民参与管理,并以某种方法达成共识,所以区块链的交易流程也就是共识的过程.       在Fabric中, ...