今天继续攻集训队论文的我

题意

一张无向图,不超过 50 50 50 个点
起点 s s s 终点 t" role="presentation">ttt
一个单位时间移动一次
一些食人鱼作周期运动 长度不超过 4 4 4
人不能碰到食人鱼
时刻 u" role="presentation">uuu 到达终点 u<=2∗109 u <= 2 ∗ 10 9 u

分析

引理

我们观察数据发现 n n n十分的小,那么就可以直接用邻接矩阵
而且有一种矩阵叫矩阵乘法
对于一张(无向)图:G" role="presentation">GGG

G[i][j]=1表示i−>j有一条边 G [ i ] [ j ] = 1 表 示 i − > j 有 一 条 边

G[i][j] = 1 表示 i - > j 有一条边
那么我们想一想 G2 G 2 G^2表示的意义是什么:

G′[a][b]=∑k=0NG[a][k]∗G[k][b] G ′ [ a ] [ b ] = ∑ k = 0 N G [ a ] [ k ] ∗ G [ k ] [ b ]

G^{'}[a][b] = \sum_{k=0}^{N}G[a][k] * G[k][b]
那么是不是就是表示 走2布的时候a−>b的方案数 走 2 布 的 时 候 a − > b 的 方 案 数 走2布的时候 a->b的方案数,那么以此类推
走 k k k布的方案数就是Gk" role="presentation">GkGkG^k了!

此题分析

我们用 Ak A k A_k 表示走 k k k布的情况下的方案数
而Gi" role="presentation">GiGiG_i表示在走第 i i i 布是的图的情况(0,1)表示
那么如果没有食人鱼的话就是:

Ak=Gk" role="presentation">Ak=GkAk=Gk

A_k = G^k

Gu=Gu−1∗Gk G u = G u − 1 ∗ G k

G^u = G^{u-1} * G_k
那么如果有食人鱼的话就是

Ak=Ak−1∗Gk A k = A k − 1 ∗ G k

A_k = A_{k-1} * G_k
那么我们看见食人鱼的循环是 2,3,4 2 , 3 , 4 2,3,4不等,但是 lcm(2,3,4)=12 l c m ( 2 , 3 , 4 ) = 12 lcm(2,3,4) = 12
也就是意味着 G1=G13 G 1 = G 13 G_1 = G_{13} 这两张图是一样的
那么我们可以 O(n3) O ( n 3 ) O(n^3) 预处理出add矩阵

add=∏k=012Gk a d d = ∏ k = 0 12 G k

add = \prod_{k=0}^{12} G_k

a=k/12,b=k a = k / 12 , b = k

a = k / 12 , b = k % 12
那么答案的矩阵就是:

final=pow(add,a)∗∏1bGi记住矩阵乘法的左乘和右乘是不一样的 f i n a l = p o w ( a d d , a ) ∗ ∏ 1 b G i 记 住 矩 阵 乘 法 的 左 乘 和 右 乘 是 不 一 样 的

final = pow(add,a) * \prod_{1}^b G_i 记住矩阵乘法的左乘和右乘是不一样的
复杂度 O(n3log2q) O ( n 3 l o g 2 q ) O(n^3log_2{q})

代码:

#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 55
#define M 25
#define R register
using namespace std;int n, m, s, t, K, x, y, Nfish, Pow_time, leftn, ff[N], att[N][10];struct matrix
{int a[N][N];matrix(){memset(a, 0, sizeof a);}
} G[20], fuu, ans, fff;inline matrix operator * (matrix x, matrix y)
{matrix z;for(R int i = 0; i < n; ++i)for(R int j = 0; j < n; ++j)for(R int k = 0; k < n; ++k){z.a[i][j] += x.a[i][k] * y.a[k][j];if(z.a[i][j] > 10000) z.a[i][j] %= 10000;}return z;
}inline matrix Pow(matrix now, int y)
{matrix res;for(R int i = 0; i < n; ++i) res.a[i][i] = 1;while(y){if(y & 1) res = res * now;now = now * now;y >>= 1;}return res;
}inline void init()
{for(R int i = 1; i <= 12; i++){G[i] = fuu;for(R int j = 1; j <= Nfish; j++){int to = att[j][((i + 1) % ff[j]) ? ((i + 1) % ff[j]) : ff[j]];for(R int k = 0; k < n; k++)G[i].a[k][to] = 0;}}
}inline matrix solve()
{Pow_time = K / 12;leftn = K % 12;matrix ans, fff;for(R int i = 0; i < n; ++i) ans.a[i][i] = fff.a[i][i] = 1;for(R int i = 1; i <= 12; ++i) fff = fff * G[i];ans = ans * Pow(fff, Pow_time);for(R int i = 1; i <= leftn; ++i){ans = ans * G[i];}return ans;
}inline int read()
{int x=0;char c=getchar();bool flag=0;while(c<'0'||c>'9'){if(c=='-')flag=1;   c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}return flag?-x:x;
}int main()
{n = read(), m = read(), s = read(), t = read(), K = read();for(R int i = 1; i <= m; ++i){x = read(), y = read();fuu.a[x][y] = fuu.a[y][x] = 1;}Nfish = read();for(R int i = 1; i <= Nfish; ++i){ff[i] = read();for(int j = 1; j <= ff[i]; ++j)att[i][j] = read();}init();ans = solve();printf("%d\n", ans.a[s][t]);return 0;
}

[ZJOI2005]沼泽鳄鱼相关推荐

  1. [ZJOI2005]沼泽鳄鱼 矩乘dp

    如果没有食人鱼(鳄鱼),就是普通矩乘 如果有了食人鱼,就要考虑多一点 特殊值入手 注意到食人鱼的周期不会超过4次,它是很小的,而且隐藏了周期性 这个周期性已经提示了要利用周期性dp.所以就考虑把< ...

  2. ZJOI2005沼泽鳄鱼

    矩阵优化dp ** 注意:矩阵乘法没有交换律 ** 思路:类比P2151hh去散步 代码特点在一维的答案矩阵 1.矩阵优化两点间方案数不必赘述 2.注意2,3,4可以办到以他们的lcm为周期,正是因为 ...

  3. 【邻接矩阵乘法】沼泽鳄鱼

    Links 洛谷_P2579[ZJOI2005]沼泽鳄鱼 SSL_P2511沼泽鳄鱼 居然有点想接触一下鳄鱼这种生物- 题目 解 由于鳄鱼的活动周期只有2,3,4. 所以很容易得到一个为期12的大周期 ...

  4. 欢乐纪中某A组赛【2019.7.6】

    前言 斐大爷NBNBNB 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 RankRankRank PersonPersonPerson ScoreScoreScore AAA BBB CCC ...

  5. 2019.07.06【NOIP提高组】模拟 A 组总结

    题目 [jzoj 2679] 跨时代 {暴力状压+背包} [luogu 2579] [ZJOI2005]沼泽鳄鱼 {矩阵乘法} [jzoj 1214] [luogu 4130] [NOI2007]项链 ...

  6. 矩阵乘法 x 图的邻接矩阵

    邻接矩阵是一种用矩阵形式表示图的方法 那么如果用图的邻接矩阵作矩阵乘法 会有什么神奇的性质呢 我们假设一个N个结点的无向图 我们用G[u][v]=G[v][u]=1G[u][v]=G[v][u]=1G ...

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

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

  8. 1898: [Zjoi2005]Swamp 沼泽鳄鱼

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec   Memory Limit: 64 MB Submit: 984   Solved: 557 [ Submi ...

  9. BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1085  Solved: 604 [Submit] ...

最新文章

  1. easyexcel生成excel_阿里JAVA解析Excel工具easyexcel
  2. ovirt官方安装文档 附录F
  3. C++ RCSP智能指针简单实现与应用
  4. China SAFe DAY 2020中国规模化敏捷大会圆满落幕
  5. 【 C 】字符串函数专题
  6. 帮助创建未来的 .NET 客户端开发
  7. Windows 7安全补丁KB3110329遭遇更新失败 且暂无解决方法
  8. vue 封装dialog_自己封装dialog组件
  9. python函数使用易错举例
  10. 文件管理搜不到Android 里的文件,Android:在原始文件夹中添加文件后窗口找不到内容容器视图...
  11. Java并发编程实战读书笔记之死锁
  12. Java与模式.pdf
  13. 【翻译召集令】HenCoder 反向翻译计划
  14. java如何去掉文件后缀名_JAVA 递归批量更改文件后缀名 删除后缀
  15. 回撤率 python 平台_python夏普率、最大回撤计算
  16. 巨佬Jake Wharton曾说过:一个App只需要一个Activity
  17. 在桌面计算机找不到光盘驱动,如何弹出DVD驱动器,没有按钮,我在计算机中找不到DVD驱动器...
  18. 因为一个MySQL权限问题引发的填坑之一(ERROR1045:Access Denied for user 'root'@'localhost' (using password:YES))
  19. python立方根求解_计算python中的立方根
  20. SQL Server 沿用上一日的数据

热门文章

  1. vue 评论区回复无限嵌套实现代码
  2. 查找一个一堆数中的一个数
  3. 用力一瞥Android渲染机制-黄油计划
  4. 男人,就要对自己下手狠一点
  5. 企业OA管理系统需具备哪些功能?
  6. 销量反弹,高管离职,苹果真的要改变高定价策略了?
  7. Mybatis——注入执行sql查询、更新、新增以及建表语句
  8. 一文读懂 WalletConnect
  9. [5-23]绿色精品软件每天更新[uc23整理]
  10. 官网下载VMware Workstation Player 16、15、14