题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898

求到达方案数...还是矩阵快速幂;

能够到达就把邻接矩阵那里赋成1,有鳄鱼的地方从各处来的路径都是0;

因为时间周期只有2,3,4,所以每12个时间就是一个循环;

可以用矩阵快速幂做了。

一开始写了个一团糟,也不明白样例为什么输出0了...

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int const mod=;
int n,m,st,ed,K,head[],ct,nf,ey[][],te[],ans[],tmp[];
struct E{
int to,next;
E(int t=,int n=):to(t),next(n) {}
}edge[];
struct Matrix{
int a[][];
Matrix operator * (const Matrix &y) const
{
Matrix x;
memset(x.a,,sizeof x.a);
for(int i=;i<=n;i++)
for(int k=;k<=n;k++)
for(int j=;j<=n;j++)
(x.a[i][j]+=a[i][k]*y.a[k][j])%=mod;
return x;
}
}s[],b;
void add(int x,int y){edge[++ct]=E(y,head[x]); head[x]=ct;}
void build1()
{
for(int x=;x<=n;x++)
for(int i=;i<=;i++)
for(int j=head[x],u;j;j=edge[j].next)
s[i].a[x][u=edge[j].to]=;//
}
void build2()
{
for(int i=;i<=nf;i++)
for(int t=;t<=;t++)
for(int j=;j<=n;j++)
{
int x=ey[i][t%te[i]];
// for(int k=head[x],y;k;k=edge[k].next)
// s[j].a[y=edge[k].to][x]=0;
s[t].a[j][x]=;
}
}
//void init(Matrix &x)
//{
// memset(x.a,0,sizeof x.a);
// for(int i=1;i<=55;i++)
// for(int j=55;j;j--)
// x.a[i][j]=1;
//}
void mul2(int a[],int b[][],int c[])
{
int tmp[];
for(int j=;j<n;j++)
{
tmp[j]=;
for(int k=;k<n;k++)
tmp[j]=(tmp[j]+a[k]*b[k][j])%mod;
}
for(int j=;j<n;j++)
c[j]=tmp[j];
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&st,&ed,&K);
st++; ed++;
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
x++; y++;
add(x,y); add(y,x);
}
scanf("%d",&nf);
for(int i=;i<=nf;i++)
{
scanf("%d",&te[i]);
for(int j=;j<=te[i];j++)
scanf("%d",&ey[i][j]),ey[i][j]++;
}
build1(); build2();
// init(s[13]);
for(int i=;i<=n;i++)
b.a[i][i]=s[].a[i][i]=;
for(int i=;i<=;i++)s[]=s[]*s[i];
// Matrix b; init(b);
int t=K/;
while(t)
{
if(t&)b=b*s[];
s[]=s[]*s[];
t>>=;
}
t=K%;
for(int i=;i<=t;i++)b=b*s[i];
// for(int i=1;i<=55;i++)
// for(int j=1;j<=55;j++)
// if(b.a[i][j])printf("b:%d\n",b.a[i][j]);
// tmp[st]=1;
// for(int i=1;i<=n;i++)
// for(int j=1;j<=n;j++)
// (ans[i]+=tmp[j]*b.a[j][i])%=mod;
ans[st]=;
mul2(ans,b.a,ans);
printf("%d",ans[ed]);
return ;
}

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int const mod=;
int n,m,st,ed,K,nf,ey[];
struct Matrix{
int a[][];
Matrix operator * (const Matrix &y) const
{
Matrix x;
memset(x.a,,sizeof x.a);
for(int i=;i<=n;i++)
for(int k=;k<=n;k++)
for(int j=;j<=n;j++)
(x.a[i][j]+=a[i][k]*y.a[k][j])%=mod;
return x;
}
Matrix(){memset(a,,sizeof a);}//
void init()
{
for(int i=;i<=n;i++) a[i][i]=;
}
}s[],b;
Matrix operator ^ (Matrix a,int k)
{
Matrix ret; ret.init();
while(k)
{
if(k&)ret=ret*a;
a=a*a;
k>>=;
}
return ret;
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&st,&ed,&K);
st++; ed++;
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
x++; y++;
for(int j=;j<=;j++)
s[j].a[x][y]=s[j].a[y][x]=;
}
scanf("%d",&nf);
for(int i=,tt;i<=nf;i++)
{
scanf("%d",&tt);
for(int j=;j<=tt;j++)
scanf("%d",&ey[j]),ey[j]++;
for(int j=;j<=;j++)
for(int k=;k<=n;k++)
s[j].a[k][ey[j%tt+]]=;//+1
}
s[].init();
for(int i=;i<=;i++)s[]=s[]*s[i];
b=s[]^(K/);
for(int i=;i<=K%;i++)b=b*s[i];
printf("%d",b.a[st][ed]);
return ;
}

bzoj1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂的更多相关文章

  1. BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵快速幂)

    题意 题目链接 Sol 不难发现吃人鱼的运动每\(12s\)一个周期 所以暴力建12个矩阵,放在一起快速幂即可 最后余下的部分暴力乘 #include<bits/stdc++.h> usi ...

  2. bzoj 1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 当然是邻接矩阵做转移矩阵来快速幂. 对于鳄鱼,好在它们周期的lcm是12,也就是每12 ...

  3. BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1898 题意概括 有一个无向图. 其中,有许多条鱼在以循环的规律出现,比如循环在1,2,3这些点出现 ...

  4. 【BZOJ1898】[Zjoi2005]Swamp 沼泽鳄鱼 矩阵乘法

    [BZOJ1898][Zjoi2005]Swamp 沼泽鳄鱼 Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎 ...

  5. BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵乘法)

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 Description 潘塔 ...

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

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

  7. 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1012  Solved: 566[Submit][S ...

  8. [luogu2579 ZJOI2005] 沼泽鳄鱼(矩阵快速幂)

    传送门 题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石 ...

  9. BZOJ 1898 沼泽鳄鱼(矩阵快速幂)

    没有食人鱼不是裸题吗,用一个向量表示从s到1..N的距离,然后不停乘邻接矩阵行了,当然快速幂 有食人鱼,发现食人鱼最多十二个邻接矩阵一循环,处理出12个作为1个然后快速幂行了   怎么处理呢? 假设食 ...

随机推荐

  1. Vue如何mock数据模拟Ajax请求

    我们在做一个项目时前期可能没有后端提供接口模拟数据,那么作为前端就需要自己写json文件模拟数据加载.网上往往参考的都是不全面的,比如get请求没问题但是post请求就报错了.在Vue中只需要vue- ...

  2. npm 发包

    前几天封装了公用的locaStorage组件,当然封装后需要发布npm官网,于是摸索了一番终于搞定了,总结下来希望对大家有所帮助 npm安装的package一般支持下面几大类: 本地包 url远程包 ...

  3. xcap发包工具的简单使用2(发送报文)

    上一篇文章介绍了如何构造报文,现在简单讲一下发送报文的步骤 1.获取接口列表 点击主界面工具栏中的“刷新列表”按钮(或对应菜单“interface->Reference interfaces”) ...

  4. 添物零基础到架构师(基础篇) - JavaScript

    JavaScript是什么? JavaScript是web开发必须学习的,ECMAScript是其规则来源. JavaScript的历史 Developed by Brendan Eich of Ne ...

  5. 二元决策图(Binary decision diagram)

    修一门写作课题目是Binary decision diagram.在网上查了些资料感觉说的都不是很清楚,看了半天还是很困惑,这到底是个啥?到底咋使?于是决定写下这篇随笔,总结一下看过的各种资料加上自己 ...

  6. 共享一个NOI用过的vimrc [rc][vimrc]

    set nocp set nu set ru set noet set ai set cin set mouse =a set mp=g++\ %\ -o\ %<\ -g\ -Wall\ -Ws ...

  7. Memory Ordering in Modern Microprocessors

    Linux has supported a large number of SMP systems based on a variety of CPUs since the 2.0 kernel. L ...

  8. T1003 电话连线 codevs

    http://codevs.cn/problem/1003/ 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 一个国家有n个城市 ...

  9. Vue.js组件的通信之父组件向子父组件的通信

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. java.util.Scanner

    java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎 ...