题目: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. buf.values()

    buf.values() 返回:{Iterator} 创建并返回一个包含 Buffer 值(字节)的迭代器.当 Buffer 使用 for..of 声明时将自动调用该函数. const buf = B ...

  2. leetcode-832翻转图像

    翻转图像 思路: 先对图像进行水平翻转,然后反转图片(对每个像素进行异或操作) 代码: class Solution: def flipAndInvertImage(self, A: List[Lis ...

  3. IP_MULTICAST_LOOP

    WINDOWS 中 该选项仅控制接收部分.即设置为0 则控制套接字无法接收自身消息.设置为1 则控制套接字使能接收自身消息. LINUX         中 该先项仅控制发送部分.即设置为0 则控制套 ...

  4. 【03】《论道html5》(全)

    [03]   <论道html5>   共320页. 魔芋:已看完.   读后感:html5各个新特性的介绍.介绍了canvas,web socket,audio,video,web wor ...

  5. Jmeter关联,正则表达式提取器使用2

    正则表达式的用处很多,最基础的用法 1,断言 2,传参(关联) 例子 1.http请求 2正则表达式提取,想要提取列表列中id,一遍打开列表页 如果是1,每次就会取相同的值!匹配数字的权限高于模板$0 ...

  6. Error connecting to database: No such file or directory

    标签:Error connecting to database: No such file or directory 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明 ...

  7. React & search & keyboard ghost

    React & search & keyboard ghost DOM events https://www.w3schools.com/jsref/dom_obj_event.asp ...

  8. requests模块发送POST请求

    在HTTP协议中,post提交的数据必须放在消息主体中,但是协议中并没有规定必须使用什么编码方式,从而导致了 提交方式 的不同.服务端根据请求头中的 Content-Type 字段来获知请求中的消息主 ...

  9. Mayor's posters POJ - 2528

    The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign h ...

  10. HDU——1285 确定比赛名次

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...