矩阵-bzoj1898
This article is made by Jason-Cow.
Welcome to reprint.
But please post the article's address.
图上求路径数问题
随机地加入一些“鱼”,它们的变化有周期性,且周期为2,3或4
人不可与“鱼”共处一个柱子,问从S->T恰好经过K步的方案数
很容易想到BFS,但是K太大
观察到lcm(2,3,4)=12
所以可以用矩阵存储,求出转移矩阵,然后快速幂加速
Ans=A[]^(K/)
然后对于剩下的K%12累乘过去
Ans=Ans*A[i]
题目里有一些板子,总结一下,可以备用
1.矩阵乘法,忽略 “ +0 ”
Matrix operator*(Matrix A,Matrix B){
Matrix C;
for(int k=;k<=N;k++)
for(int i=;i<=N;i++)
if(A.a[i][k])
for(int j=;j<=N;j++)
if(B.a[k][j])
(C.a[i][j]+=(A.a[i][k]*B.a[k][j])%MOD)%=MOD;
return C;
}
2.矩阵快速幂,基于“ * ”
Matrix operator^(Matrix A,int b){
Matrix ans;for(int i=;i<=N;i++)ans.a[i][i]=;
for(;b;A=A*A,b>>=)if(b&)ans=ans*A;
return ans;
}
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
inline int _(){
int ans=;char x=getchar();bool f=;
while(x<''||x>''){if(x=='-')f=;x=getchar();}
while(x>=''&&x<='')ans=ans*+x-'',x=getchar();
return f?-ans:ans;
}
const int MOD=,SZ=;
int N,M,S,T,K,F,f[][],t[];
struct Matrix{
int a[SZ][SZ];
Matrix(){memset(a,,sizeof(a));}
}A[],Ans;
Matrix operator*(Matrix A,Matrix B){
Matrix C;
for(int k=;k<=N;k++)
for(int i=;i<=N;i++)
if(A.a[i][k])
for(int j=;j<=N;j++)
if(B.a[k][j])
(C.a[i][j]+=(A.a[i][k]*B.a[k][j])%MOD)%=MOD;
return C;
}
Matrix operator^(Matrix A,int b){
Matrix ans;for(int i=;i<=N;i++)ans.a[i][i]=;
for(;b;A=A*A,b>>=)if(b&)ans=ans*A;
return ans;
}
int main(){
N=_(),M=_(),S=_()+,T=_()+,K=_();
int i,j,k,x,y;
for(i=;i<=M;i++)
for(x=_()+,y=_()+,j=;j<=;j++)A[j].a[x][y]=A[j].a[y][x]=; for(F=_(),i=;i<=F;i++)
for(j=,t[i]=_();j<=t[i];j++)f[i][j]=_()+; for(i=;i<=F;i++)
for(j=;j<=;j++)
for(k=,x=f[i][j%t[i]+];k<=N;k++)
A[j].a[k][x]=; for(i=;i<=N ;i++)A[].a[i][i]=;
for(i=;i<=;i++)A[]=A[]*A[i];
Ans=A[]^(K/);
for(i=;i<=K%;i++)Ans=Ans*A[i];
printf("%d\n",Ans.a[S][T]);
return ;
}
矩阵-bzoj1898的更多相关文章
- BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1898 题意概括 有一个无向图. 其中,有许多条鱼在以循环的规律出现,比如循环在1,2,3这些点出现 ...
- 【BZOJ1898】[ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划)
[BZOJ1898][ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 先吐槽,说好了的鳄鱼呢,题面里面全是食人鱼 看到数据范围一眼想到矩乘. 先不考虑食人鱼的问题,直接 ...
- 【BZOJ1898】[Zjoi2005]Swamp 沼泽鳄鱼 矩阵乘法
[BZOJ1898][Zjoi2005]Swamp 沼泽鳄鱼 Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎 ...
- 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1012 Solved: 566[Submit][S ...
- BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵快速幂)
题意 题目链接 Sol 不难发现吃人鱼的运动每\(12s\)一个周期 所以暴力建12个矩阵,放在一起快速幂即可 最后余下的部分暴力乘 #include<bits/stdc++.h> usi ...
- bzoj1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 求到达方案数...还是矩阵快速幂: 能够到达就把邻接矩阵那里赋成1,有鳄鱼的地方从各处 ...
- BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵乘法)
1898: [Zjoi2005]Swamp 沼泽鳄鱼 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 Description 潘塔 ...
- BZOJ1898: [Zjoi2004]Swamp 沼泽鳄鱼
1898: [Zjoi2004]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 478 Solved: 286[Submit][St ...
- C语言 · 矩阵乘法 · 算法训练
问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...
随机推荐
- ubuntu 16.04.1上安装并使用vsftpd
1.安装vsftpd软件 sudo apt-get install vsftpd 2.新建文件 sudo vim /etc/vsftpd.user_list 用于记录用户名 3. 修改sudo vim ...
- 解决laravel 429请求错误
429 Too Many Requests(过多请求) 用户在在指定的时间里发送了太多的请求.用于限制速率. 这是laravel的api访问频率 找出throttle 这个中间件,注释掉.429问题 ...
- 占位 CP
占位 CP include: CP403 CP404 CP405
- static静态不是很静
在类中定义变量时,不会开辟存储空间,只有类定义一个对象时才会开辟类中成员变量的内存空间,且建立一个对象开辟一次,大小与类中的成员变量及函数有关.而static在静态区开辟内存空间,不占用内存空间. 1 ...
- openstack入门及应用
一.OpenStack云计算的介绍 (一)云计算的服务类型 IAAS:基础设施即服务,如:云主机 PAAS:平台即服务,如:docker SAAS:软件即服务,如:购买企业邮箱,CDN 传统IT IA ...
- python:创建文件夹
#!/usr/bin/python# -*- coding:utf-8 -*- import os dir = './dir'os.mkdir(dir)
- Day1 工厂模式
我的理解就是:工厂模式可以不用在乎参数的类型,工厂函数根据不同的类型,创建不同的对象.如下(简单工厂): package method.simpleFactory; import java.util. ...
- django 完成登录功能
啃了几天文档,感觉能理解了这个框架,但是真的下手的时候真的不知道从何开始. orm即Object-Relationl Mapping,看这名字就是操作数据库的,用过ssm,不过django操作数据库是 ...
- 在github网站上更新fork的repo
打开fork的repo. 点击Pull request, 这里会跳转到一个页面提示There isn’t anything to compare. 点击switching the base,将orig ...
- 月薪20k的web前端开发程序员,他们都会的这6招
web前端工程师是近几年的新兴职业,也是目前火爆而且高薪的职业.不同的公司也有不同的叫法,比如:网页界面开发,网站设计等,要学好web前端开发,需要掌握什么方法与技巧? 一.div和table 这个是 ...