BZOJ 1898 沼泽鳄鱼(矩阵快速幂)】的更多相关文章

没有食人鱼不是裸题吗,用一个向量表示从s到1..N的距离,然后不停乘邻接矩阵行了,当然快速幂 有食人鱼,发现食人鱼最多十二个邻接矩阵一循环,处理出12个作为1个然后快速幂行了   怎么处理呢? 假设食人鱼在j时刻到达x这个点,那么j时刻的邻接矩阵x这一列全是0,因为他要求下一个矩阵的贡献上不能有x这一列贡献的.   #include <iostream> #include <cstdio> #include <cstring> #include <algorith…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 求到达方案数...还是矩阵快速幂: 能够到达就把邻接矩阵那里赋成1,有鳄鱼的地方从各处来的路径都是0: 因为时间周期只有2,3,4,所以每12个时间就是一个循环: 可以用矩阵快速幂做了. 一开始写了个一团糟,也不明白样例为什么输出0了... #include<iostream> #include<cstdio> #include<cstring> using…
考试的时候想到了矩阵快速幂+快速幂,但是忘(bu)了(hui)欧拉定理. 然后gg了35分. 题目显而易见,让求一个数的幂,幂是斐波那契数列里的一项,考虑到斐波那契也很大,所以我们就需要欧拉定理了 p是素数,所以可以搞  然后我们用矩阵快速幂求出幂,然后快速幂即可解决问题 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; #de…
很容易想到记忆化搜索的算法. 令dp[n][T]为到达n点时时间为T的路径条数.则dp[n][T]=sigma(dp[i][T-G[i][n]]); 但是空间复杂度为O(n*T),时间复杂度O(n*n*T). 虽然本题的n<=10,但T最大可到1e9.行不通. 如果题目中的边的权值非0即1的话,显然1-n的长度为T的路径中数为 该图的邻接矩阵的T次幂. 实际上题目中的边权值<10. 可以用拆点的方法转化为边权值非0即1的情况. 即 将图中的每个点拆成至多9个点,首先将每个点的第i个点和第i+1…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 当然是邻接矩阵做转移矩阵来快速幂. 对于鳄鱼,好在它们周期的lcm是12,也就是每12次就又一样了. 所以把12个转移矩阵合成一下,就可以每次乘一样的,进而快速幂.%12剩下的次数暴力一下. 学到了一些方便的东西,比如struct的构造函数没有参数之类的. #include<iostream> #include<cstdio> #include<cstring&g…
题意 题目链接 Sol 不难发现吃人鱼的运动每\(12s\)一个周期 所以暴力建12个矩阵,放在一起快速幂即可 最后余下的部分暴力乘 #include<bits/stdc++.h> using namespace std; const int MAXN = 52, mod = 10000; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {if(c == '-')…
传送门 题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥,每座石桥连接着两座石墩,且每两座石墩之间至多只有一座石桥.这个景点造好之后一直没敢对外开放,原因是池塘里有不少危险的食人鱼. 豆豆先生酷爱冒险,他一听说这个消息,立马赶到了池塘,想做第一个在桥上旅游的人.虽说豆豆爱冒险,但也不敢拿自己的性命开玩笑,于是他开始了仔细的实地勘察,并得到了一些惊…
题面 传送门 分析 容易想到根据点来dp,设dp[i][j]表示到i点路径长度为j的方案数 状态转移方程为dp[i][k]=∑(i,j)∈Edp[j][k−1]" role="presentation" style="position: relative;">dp[i][k]=∑(i,j)∈Edp[j][k−1]dp[i][k]=∑(i,j)∈Edp[j][k−1] 但这样得出的结果是错误的,因为它没有考虑一个点经过多次的情况 因此,我们按边来dp,…
注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int mod=10000; int n,m,s,t,k,x,y,nf,T,w[60]; struct jz { int a[6…
思路: T的最小公倍数是12 那么12以内暴力 整除12 的部分用矩阵快速幂 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,m,st,ed,k,nfish,T,p[5],can[13][55]; struct Matrix{ int a[55][55]; void init(){memset(a,0,sizeof(a)…