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

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

注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的

所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可

#include
#include
#include
using namespace std;const int mod=10000;int n,m,s,t,k,x,y,nf,T,w[60];struct jz{ int a[60][60]; jz operator * (jz y) { jz c; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { c.a[i][j]=0; for(int k=1;k<=n;k++) c.a[i][j]=(c.a[i][j]+a[i][k]*y.a[k][j])%mod; } return c; }}a,b[15],ans;int main(){ scanf("%d%d%d%d%d",&n,&m,&s,&t,&k); s++;t++; for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); x++;y++; for(int j=1;j<=12;j++) b[j].a[x][y]=b[j].a[y][x]=1; } scanf("%d",&nf); for(int i=1;i<=nf;i++) { scanf("%d",&T); for(int j=1;j<=T;j++) scanf("%d",&w[j]),w[j]++; for(int j=1;j<=12;j++) for(int k=1;k<=n;k++) b[j].a[k][w[j%T+1]]=0; } for(int i=1;i<=n;i++) a.a[i][i]=1,ans.a[i][i]=1; for(int i=1;i<=12;i++) a=a*b[i]; int kk=k/12; while(kk) { if(kk&1) ans=ans*a; a=a*a; kk>>=1; } for(int i=1;i<=k%12;i++) ans=ans*b[i]; printf("%d",ans.a[s][t]); return 0;}

转载于:https://www.cnblogs.com/lokiii/p/9650126.html

你可能感兴趣的文章
Spring定时任务(@Scheduled)
查看>>
WebView 调试
查看>>
IB使用
查看>>
Linux硬链接和软链接(符号链接)
查看>>
git stash
查看>>
Apache Common-IO 使用
查看>>
Java-第一课正则表达式
查看>>
深入剖析,什么是eval的直接调用.
查看>>
apidoc
查看>>
3月14日-15日学习总结
查看>>
关于 ++x 和 x++ 比较难的一个例子
查看>>
第三次作业 105032014021
查看>>
记录一些容易忘记的属性 -- UILabel
查看>>
android新手关于左右滑动的问题,布局把<android.support.v4.view.ViewPager/><ImageView/> 放在上面就不行了。...
查看>>
人脸识别FaceNet+TensorFlow
查看>>
STL之map UVa156
查看>>
从Angular.JS菜鸟到专家
查看>>
再谈Vmware NAT的配置和路由流程
查看>>
javaScript数组去重方法汇总
查看>>
评价意见整合
查看>>