【bzoj1875】 SDOI2009 HH去散步 dp+矩阵乘法
来源:互联网 发布:linux mint18.1分区 编辑:程序博客网 时间:2024/05/08 21:12
SDOI的好题,今天听豪爷讲课的时候第一眼没有想出来,一般对10^9比较敏感,就能想到矩乘,但是一看2^30就开始想什么倍增了。
f[i][2][k]表示刚走完第i条边正着走还是倒着走,走过k距离的方案数。
转移是:f[i][0][k]-->f[j][0][k+1] i.y==j.x
-->f[j][1][k+1] i.y==j.y
f[i][1][k]-->f[j][0][k+1] i.x==j.x
-->f[j][1][k+1] i.x==j.y
然后矩乘就好了。
#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>#define mod 45989using namespace std;struct matrix{int x,y;int a[121][121];matrix operator* (matrix b){matrix ans;memset(ans.a,0,sizeof(ans.a));ans.x=x;ans.y=b.y;for (int i=1;i<=ans.x;i++) for (int j=1;j<=ans.y;j++) for (int k=1;k<=y;k++) ans.a[i][j]=(ans.a[i][j]+a[i][k]*b.a[k][j])%mod;return ans;}};int x[61],y[61];int n,m,k,s,t;int main(){scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);for (int i=1;i<=m;i++) scanf("%d%d",&x[i],&y[i]);matrix a,b;a.x=1,a.y=2*m;memset(a.a,0,sizeof(a.a));b.x=2*m;b.y=2*m;memset(b.a,0,sizeof(b.a));for (int i=1;i<=m;i++){if (x[i]==s) a.a[1][i]=1;if (y[i]==s) a.a[1][i+m]=1;}for (int i=1;i<=m;i++) for (int j=1;j<=m;j++) { if (i==j) continue; if (y[i]==x[j]) b.a[i][j]++; if (y[i]==y[j]) b.a[i][j+m]++; if (x[i]==x[j]) b.a[i+m][j]++; if (x[i]==y[j]) b.a[i+m][j+m]++; }matrix ans;memset(ans.a,0,sizeof(ans.a));ans.x=2*m;ans.y=2*m;for (int i=1;i<=ans.x;i++) ans.a[i][i]=1;k--;while (k>0){if (k&1) ans=ans*b;b=b*b;k>>=1;}ans=a*ans;int sum=0;for (int i=1;i<=m;i++){if (x[i]==t) sum=(sum+ans.a[1][i+m])%mod;if (y[i]==t) sum=(sum+ans.a[1][i])%mod;}printf("%d\n",sum);return 0;}
0 0
- 【bzoj1875】 SDOI2009 HH去散步 dp+矩阵乘法
- 【矩阵乘法优化DP】BZOJ1875 [SDOI2009]HH去散步
- 【DP+矩阵乘法】BZOJ1875(SDOI2009)[HH去散步]题解
- BZOJ1875 [SDOI2009]HH去散步(矩阵乘法)
- 【BZOJ1875】[SDOI2009]HH去散步(矩阵乘法)
- bzoj1875 [SDOI2009]HH去散步(矩阵)
- bzoj1875 HH去散步 矩阵乘法
- [BZOJ1875] [SDOI2009] HH去散步
- 【bzoj1875】【SDOI2009】【HH去散步】
- 【SDOI2009】【BZOJ1875】HH去散步
- bzoj1875: [SDOI2009]HH去散步
- [bzoj1875][SDOI2009]HH去散步
- BZOJ1875: [SDOI2009]HH去散步
- bzoj1875: [SDOI2009]HH去散步
- bzoj1875: [SDOI2009]HH去散步
- [BZOJ]1875: [SDOI2009]HH去散步 矩阵乘法优化DP
- [BZOJ1875][SDOI2009]HH去散步(矩阵快速幂)
- 1875: [SDOI2009]HH去散步 矩阵乘法
- 比较全面的 C++ 操作符重载 (operator)
- Python线程指南
- 欢迎使用CSDN-markdown编辑器
- 架构设计:负载均衡层设计方案(6)——Nginx + Keepalived构建高可用的负载层
- 1-1/2+1/3-1/4+.......-1/100
- 【bzoj1875】 SDOI2009 HH去散步 dp+矩阵乘法
- Delphi2010/XE2下隐藏程序系统任务栏的图标
- js中设置背景图片的路径获得方法
- Poj.3233 Matrix Power Series【矩阵快速幂】 2015/07/29
- VS2008 C++调用DLL 静态链接
- mongoDB collection name包含特殊字符处理方法
- 2015 Multi-University Training Contest 3 1004 painter
- linux 文件转码
- BING