P2579 [ZJOI2005]沼泽鳄鱼(邻接矩阵,快速幂)
题目简洁明了(一点都不好伐)
照例,化简题目
给一张图,每一个时间点有一些点不能走,(有周期性),求从起点第k秒恰好在终点的方案数,可重复,不可停留。
额dp实锤
于是就被打脸了....
有一种东西叫做邻接矩阵,还有一种东西叫做矩阵乘法,bk201大仙曾经讲过,能用邻接矩阵的k次方求这个东西。
那,难度下降了很多了。
但是,对于那周期是3,4,6的鳄鱼怎么办呢?
答案就是:
观察3,4,6,lcm(3,4,6)=12,所以,当k%12==0,鳄鱼们都回到了原状态。
所以,我们就暴力地对于每一种情况建一个邻接矩阵,把不能走的点刨掉,然后把他们依次乘起来(因为不满足交换律)
然后把它给k次方就行了。。。
值得注意的地方:
1、因为点是从0开始,所以根据我的习惯,都加上了1;
2、不满足交换律不满足交换律不满足交换律
3、k不一定整除12,所以在剩余的那一部分要手动乘一下初始矩阵
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=;
const int mod=;
int m,n,st,en,K,fn;
int map[maxn][maxn];
int unable[maxn][maxn];
struct node
{
int a[maxn][maxn];
node()
{
memset(a,,sizeof(a));
}
}q,w[];
inline node operator * (const node& x,const node& y)
{
node z;
for(int i=;i<=n;i++)
{
for(int k=;k<=n;k++)
{
for(int j=;j<=n;j++)
{
z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
}
}
}
return z;
}
node ksm(node x,int y)
{
node z;
for(int i=;i<=n;i++)
z.a[i][i]=;
while(y)
{
if(y&)
z=z*x;
x=x*x;
y>>=;
}
return z;
} int main()
{
scanf("%d%d%d%d%d",&n,&m,&st,&en,&K);
st++;en++;
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x++;y++;
map[x][y]=map[y][x]=;
}
scanf("%d",&fn);
while(fn--)
{
int x;
scanf("%d",&x);
for(int j=;j<x;j++)
{
int y;
scanf("%d",&y);
y++;
for(int k=j;k<;k+=x)
{
unable[k][y]=true;
}
}
} for(int i=;i<=n;i++)
{
q.a[i][i]=;
}
for(int i=;i<;i++)
{
for(int j=;j<=n;j++)
{
for(int k=;k<=n;k++)
{
w[i].a[j][k]=(map[j][k]&&!unable[i][k]);
}
}
}
for(int i=;i<;i++)
{
q=q*w[i];
}
q=q*w[];
int k=K/,t=K-k*;
node ans;
for(int i=;i<=n;i++)
{
ans.a[i][i]=;
}
ans=ans*ksm(q,k);
for(int i=;i<=t;i++)
ans=ans*w[i];
printf("%d ",ans.a[st][en]);
return ;
}
(完)
P2579 [ZJOI2005]沼泽鳄鱼(邻接矩阵,快速幂)的更多相关文章
- [luogu2579 ZJOI2005] 沼泽鳄鱼(矩阵快速幂)
传送门 题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石 ...
- P2579 [ZJOI2005]沼泽鳄鱼(矩乘)
P2579 [ZJOI2005]沼泽鳄鱼 没有食人鱼:直接矩乘优化 有食人鱼:食人鱼周期2.3.4,公倍数12,可以以12为一个周期矩乘,剩下的暴力 注意矩乘不满足乘法交换律,一定要注意乘的顺序 #i ...
- bzoj 1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 当然是邻接矩阵做转移矩阵来快速幂. 对于鳄鱼,好在它们周期的lcm是12,也就是每12 ...
- bzoj1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 求到达方案数...还是矩阵快速幂: 能够到达就把邻接矩阵那里赋成1,有鳄鱼的地方从各处 ...
- BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵快速幂)
题意 题目链接 Sol 不难发现吃人鱼的运动每\(12s\)一个周期 所以暴力建12个矩阵,放在一起快速幂即可 最后余下的部分暴力乘 #include<bits/stdc++.h> usi ...
- HDU 2157 How many ways?? (邻接矩阵快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=2157 题意 : 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值 从这道题 ...
- BZOJ 1898 沼泽鳄鱼(矩阵快速幂)
没有食人鱼不是裸题吗,用一个向量表示从s到1..N的距离,然后不停乘邻接矩阵行了,当然快速幂 有食人鱼,发现食人鱼最多十二个邻接矩阵一循环,处理出12个作为1个然后快速幂行了 怎么处理呢? 假设食 ...
- P2579 [ZJOI2005]沼泽鳄鱼
传送门 话说邻接矩阵居然还能快速幂的么-- 把原图的邻接矩阵\(G\)打出来,那么\(G[u][v]\)表示一秒后\(u\)到\(v\)的方案数,\(G^2[u][v]\)表示\(2\)秒后的方案数- ...
- 题解-[ZJOI2005]沼泽鳄鱼
题解-[ZJOI2005]沼泽鳄鱼 前置知识: 邻接矩阵 矩阵乘法 矩阵快速幂 [ZJOI2005]沼泽鳄鱼 给一个有 \(N\) 个点,\(M\) 条双向边的图 \(G\),其中有 \(NFish\ ...
随机推荐
- 人生,还没困难到"非死不可"
最近半个月,美国著名的Facebook公司,出了好几件大事.第一件事,2019年9月19日,一名陈姓中国软件工程师在Facebook加州总部跳楼自杀.第二件事,2019年10月4日,一名软件工程师在座 ...
- e课表项目第二次冲刺周期第五天
昨天干了什么? 昨天,我们组商量了主界面的主要设计,然后我查找了相关的资料,将主界面改成了一个连接数据库,并将数据库中的数据进行显示.接着,又在网上搜了一些资料,为数据建立了一个布局,能够显示该数据的 ...
- Vue中音乐播放器
一.安装依赖 yarn add vue-aplayer or` npm i vue-aplayer 二.使用 <template> <div class="vue_ap ...
- js 变量与常量
编辑器:Sublime Text 3 <!DOCTYPE html><html lang="en"><head> <meta charse ...
- 代码审计之create_function()函数
0x00 create_function()简介 适用范围:PHP 4> = 4.0.1,PHP 5,PHP 7 功能:根据传递的参数创建匿名函数,并为其返回唯一名称. 语法: create_f ...
- Centos7安装moloch步骤
Centos7安装moloch步骤 Moloch 是一个由AOL开源的,能够大规模的捕获IPv4数据包(PCAP).索引和数据库系统,由以下三个部分组成: capture :绑定interface ...
- Halcon一日一练:阈值分割的几个算子
threshold(Image:Region:MinGray:MaxGray:) 功能:得到灰度值在最小与最大这间的那些部分.其返回仍然是一个区域. MinGray<MaxGray. 这个算子可 ...
- cinatra::http框架编译使用
cinatra 一个高效易用的c++ http框架 1.下载源码 https://github.com/qicosmos/cinatra 2. vs2017 编译boost库 [msvc-14.1] ...
- vue移动端 实现手机左右滑动入场动画
app.vue <template> <div id="app"> <transition :name="transitionName&qu ...
- centos7将本地的镜像挂载做yum源
首先将镜像挂载上来(用的是VNware),mount命令可以看到自动挂载的位置. mount可以看到挂载在/dev/sr0 这个位置. 接着来新建另一个挂载点:mkdir /iso mount /de ...