题目: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. 2017 GDCPC 省赛总结

    第一年参加省赛,也是我接触acm半年多的第一个正式省级赛事,这半年来我为acm付出的可能很多,但经历过这次省赛后,给我唯一的感觉就是,还不够多. 直接分析题目吧,开始拿到试题后我读的是A题,然后我的队 ...

  2. STM32F407 IO引脚复用器和映射 个人笔记

    基本概念 stm32有一些内置外设,每个外设有一个复用功能AF(Alternate functions). stm32的每个io引脚东路有一个16路复用器,该复用器一端连该引脚,另外16端连AF0~A ...

  3. jQuery入门--- 非常好

    jQuery入门------https://blog.csdn.net/dkh_321/article/details/78093788

  4. MVC系统学习8——AsyncController

    关于为什么使用异步Controller,这里不做备忘,三岁小孩都懂.主要的备忘是如何使用AsyncController. //这个action以Async结尾,并且返回值是void public vo ...

  5. fzu 2113 数位dp

    #include<stdio.h> #include<string.h> #define N 20 #define ll __int64 ll dp[N][N];//最多记忆4 ...

  6. POJ1276 Cash Machine

    Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %lld & %llu Description A Bank pla ...

  7. 【周期性执行事件】MySQL事件(Event)&任务调度

    1.事件简介 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”. 事件和触发器类似,都是在 ...

  8. 【git】Git 提示fatal: remote origin already exists 错误解决办法

    今天使用git 添加远程github仓库的时候提示错误:fatal: remote origin already exists. 最后找到解决办法如下: 1.先删除远程 Git 仓库 $ git re ...

  9. HDU1166 线段树裸题 区间求和

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. HttpClientUtil 工具类 实现跨域请求数据

    package com.xxx.common.util; import java.io.IOException; import java.net.URI; import java.util.Array ...