[ZJOI2005]沼泽鳄鱼
今天继续攻集训队论文的我
题意
一张无向图,不超过 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 有一条边
那么我们想一想 G2 G 2 G^2表示的意义是什么:
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)表示
那么如果没有食人鱼的话就是:
A_k = G^k
G^u = G^{u-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 = \prod_{k=0}^{12} G_k
a = k / 12 , b = k % 12
那么答案的矩阵就是:
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]沼泽鳄鱼相关推荐
- [ZJOI2005]沼泽鳄鱼 矩乘dp
如果没有食人鱼(鳄鱼),就是普通矩乘 如果有了食人鱼,就要考虑多一点 特殊值入手 注意到食人鱼的周期不会超过4次,它是很小的,而且隐藏了周期性 这个周期性已经提示了要利用周期性dp.所以就考虑把< ...
- ZJOI2005沼泽鳄鱼
矩阵优化dp ** 注意:矩阵乘法没有交换律 ** 思路:类比P2151hh去散步 代码特点在一维的答案矩阵 1.矩阵优化两点间方案数不必赘述 2.注意2,3,4可以办到以他们的lcm为周期,正是因为 ...
- 【邻接矩阵乘法】沼泽鳄鱼
Links 洛谷_P2579[ZJOI2005]沼泽鳄鱼 SSL_P2511沼泽鳄鱼 居然有点想接触一下鳄鱼这种生物- 题目 解 由于鳄鱼的活动周期只有2,3,4. 所以很容易得到一个为期12的大周期 ...
- 欢乐纪中某A组赛【2019.7.6】
前言 斐大爷NBNBNB 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 RankRankRank PersonPersonPerson ScoreScoreScore AAA BBB CCC ...
- 2019.07.06【NOIP提高组】模拟 A 组总结
题目 [jzoj 2679] 跨时代 {暴力状压+背包} [luogu 2579] [ZJOI2005]沼泽鳄鱼 {矩阵乘法} [jzoj 1214] [luogu 4130] [NOI2007]项链 ...
- 矩阵乘法 x 图的邻接矩阵
邻接矩阵是一种用矩阵形式表示图的方法 那么如果用图的邻接矩阵作矩阵乘法 会有什么神奇的性质呢 我们假设一个N个结点的无向图 我们用G[u][v]=G[v][u]=1G[u][v]=G[v][u]=1G ...
- BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼 [矩阵乘法]
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1082 Solved: 602 [Submit] ...
- 1898: [Zjoi2005]Swamp 沼泽鳄鱼
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 984 Solved: 557 [ Submi ...
- BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1085 Solved: 604 [Submit] ...
最新文章
- easyexcel生成excel_阿里JAVA解析Excel工具easyexcel
- ovirt官方安装文档 附录F
- C++ RCSP智能指针简单实现与应用
- China SAFe DAY 2020中国规模化敏捷大会圆满落幕
- 【 C 】字符串函数专题
- 帮助创建未来的 .NET 客户端开发
- Windows 7安全补丁KB3110329遭遇更新失败 且暂无解决方法
- vue 封装dialog_自己封装dialog组件
- python函数使用易错举例
- 文件管理搜不到Android 里的文件,Android:在原始文件夹中添加文件后窗口找不到内容容器视图...
- Java并发编程实战读书笔记之死锁
- Java与模式.pdf
- 【翻译召集令】HenCoder 反向翻译计划
- java如何去掉文件后缀名_JAVA 递归批量更改文件后缀名 删除后缀
- 回撤率 python 平台_python夏普率、最大回撤计算
- 巨佬Jake Wharton曾说过:一个App只需要一个Activity
- 在桌面计算机找不到光盘驱动,如何弹出DVD驱动器,没有按钮,我在计算机中找不到DVD驱动器...
- 因为一个MySQL权限问题引发的填坑之一(ERROR1045:Access Denied for user 'root'@'localhost' (using password:YES))
- python立方根求解_计算python中的立方根
- SQL Server 沿用上一日的数据