博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂
阅读量:7176 次
发布时间:2019-06-29

本文共 1471 字,大约阅读时间需要 4 分钟。

题目:

当然是邻接矩阵做转移矩阵来快速幂。

对于鳄鱼,好在它们周期的lcm是12,也就是每12次就又一样了。

所以把12个转移矩阵合成一下,就可以每次乘一样的,进而快速幂。%12剩下的次数暴力一下。

学到了一些方便的东西,比如struct的构造函数没有参数之类的。

#include
#include
#include
using namespace std;const int N=55,mod=1e4;int n,m,st,ed,k,fs;struct Matrix{ int a[N][N]; Matrix(){memset(a,0,sizeof a);} Matrix operator*(const Matrix &b)const { Matrix c; memset(c.a,0,sizeof c.a);// for(int i=1;i<=n;i++) for(int k=1;k<=n;k++) for(int j=1;j<=n;j++) (c.a[i][j]+=a[i][k]*b.a[k][j]%mod)%=mod; return c; } void init() { for(int i=1;i<=n;i++)a[i][i]=1; }}r[15],ans;int main(){ scanf("%d%d%d%d%d",&n,&m,&st,&ed,&k);st++;ed++; int x,y; for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y);x++;y++; for(int j=1;j<=12;j++) r[j].a[x][y]=1,r[j].a[y][x]=1; } scanf("%d",&fs); for(int i=1;i<=fs;i++) { scanf("%d",&x); for(int j=1;j<=x;j++) { scanf("%d",&y);y++; for(int k=j;k<=12;k+=x) memset(r[k].a[y],0,sizeof r[k].a[y]); } } r[13].init(); for(int i=1;i<=12;i++)r[13]=r[13]*r[i]; ans.a[1][st]=1;x=k/12; while(x) { if(x&1)ans=ans*r[13]; r[13]=r[13]*r[13];x>>=1; } x=k%12; for(int i=1;i<=x;i++)ans=ans*r[i]; printf("%d",ans.a[1][ed]); return 0;}

 

转载于:https://www.cnblogs.com/Narh/p/9246516.html

你可能感兴趣的文章
js 各种事件 如:点击事件、失去焦点、键盘事件等
查看>>
Linux篇---Vi的使用
查看>>
DX插件AspxGridview根据单元格值得不同设置字体颜色
查看>>
Add&Delete WindowService
查看>>
C#for(;;)是什么意思?
查看>>
数据自动备份解决方案
查看>>
北斗二代时钟服务器实现重大技术突破,性能已超越美国GPS
查看>>
tornado 05 模块继承
查看>>
1118. Birds in Forest (25)
查看>>
Introduction to jQuery Mobile
查看>>
Android Audio System 之一:AudioTrack如何与AudioFlinger交换音频数据(转)0
查看>>
BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
查看>>
Max Sequence
查看>>
第二篇*1、Python基本数据类型
查看>>
Mybatis中$和#的区别
查看>>
EntityFramework_基础
查看>>
maven常用命令介绍(持续更新)
查看>>
【题解】选牛
查看>>
css z-index
查看>>
php产品细节图多图上传示例代码 无刷新
查看>>