题目: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. 数据结构代码实现之队列的链表实现(C/C++)

    上班闲着无聊,一直想着要开始写博客,但又不知道写什么.最近又回顾了下数据结构的知识,那就从数据结构开始吧. 前言 关于C语言结构体的知识以及队列的特性请读者自行了解,此处不做过多解释,嘻嘻. 同时此篇 ...

  2. Java基础学习总结(89)——为什么单元测试应该我们开发人员来写

    软件测试是为了保证项目质量,单元测试可以快速执行测试回归测试,做好单元测试可以大大提升测试效率,项目开发真正达到敏捷效果. 单元测试做什么? 1. 核心类方法 2. 异常处理 3. 边界值测试 4. ...

  3. HttpModule用户的验证

    HttpModule是向实现类提供模块初始化和处置事件.当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于H ...

  4. Windows 10 & Game Bar & YouTube & video records

    Windows 10 & Game Bar & YouTube & video records Windows 10 C:\Users\xgqfrms\Videos\Captu ...

  5. bzoj 2588 Spoj 10628. Count on a tree (可持久化线段树)

    Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 7669  Solved: 1894[Submi ...

  6. 【springmvc】传值的几种方式&&postman接口测试

    最近在用postman测试postman接口,对于springmvc传值这一块,测试了几种常用方式,总结一下.对于postman这个工具的使用也增加了了解.postman测试很棒,有了工具,测试接口, ...

  7. 2.5 3-way quickSort

    1.排序时,数组含有大量重复元素,应该使用哪种排序手段? (1)mergeSort:与数组的特征无关,比较次数总是在1/2NlgN~NlgN之间 (2)quickSort:当所有的元素全都相同的时候, ...

  8. 【Eclipse】eclipse中设置tomcat启动时候的JVM参数

    主要通过以下的几个jvm参数来设置堆内存的: -Xmx512m 最大总堆内存,一般设置为物理内存的1/4 -Xms512m 初始总堆内存,一般将它设置的和最大堆内存一样大,这样就不需要根据当前堆使用情 ...

  9. 从零开始写STL—容器—vector

    从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...

  10. MongoDB小结06 - update【$push】

    数组修改器,既然名字都这样叫了,那么这个修改器就只能对数组进行操作啦. db.user.update({"name":"qianjiahao"},{" ...