bzoj 4417: [Shoi2013]超级跳马
来源:互联网 发布:js getjson 获取数据 编辑:程序博客网 时间:2024/06/07 10:12
题意:
现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角。每一步它向右跳奇数列,且跳到本行或相邻行。求跳法种数mod 30011。
题解:
看这种题应该是dp+矩乘。
dp还是挺容易的,
大概是这样:
f[1][1]=1; for(LL j=2;j<=m;j++) { for(LL i=1;i<=n;i++) { if(j%2==0) (f[i][0]+=(f[i-1][1]+f[i][1]+f[i+1][1]))%=mod; if(j%2==1) (f[i][1]+=(f[i-1][0]+f[i][0]+f[i+1][0]))%=mod; } } if(m%2==0) printf("%lld",(f[n][1]+f[n-1][1])%mod); else printf("%lld",(f[n][0]+f[n-1][0])%mod);
然后就是要矩乘了。
这题好像不太好构造,因为每一次更新的都是不同维的。
我的做法是这样:分别构造出两个矩阵,然后乘起来再快速幂。
口胡不清,具体代码。
code:
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#define LL long longusing namespace std;const LL mod=30011;struct node{ LL a[105][105],n,m;};node operator * (node a,node b) { node ans; memset(ans.a,0,sizeof(ans.a)); ans.n=a.n;ans.m=b.m; for(LL i=1;i<=a.n;i++) for(LL j=1;j<=b.m;j++) for(LL k=1;k<=a.m;k++) (ans.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod)%=mod; return ans;}LL n,m;node quick(node a,LL b){ node ans;ans.n=a.n;ans.m=a.m; memset(ans.a,0,sizeof(ans.a)); for(LL i=1;i<=a.n;i++) ans.a[i][i]=1; while(b) { if(b&1) ans=ans*a; a=a*a;b>>=1; } return ans;}int main(){ scanf("%lld %lld",&n,&m); node a,b;a.n=a.m=b.n=b.m=2*n; memset(b.a,0,sizeof(b.a)); memset(a.a,0,sizeof(a.a)); for(LL i=1;i<=2*n;i++) { a.a[i][i]=b.a[i][i]=1; if(i<=n) { a.a[i+n][i]=1; if(i!=1) a.a[i-1+n][i]=1; if(i!=n) a.a[i+1+n][i]=1; } else { b.a[i-n][i]=1; if(i!=n+1) b.a[i-1-n][i]=1; if(i!=n+n) b.a[i+1-n][i]=1; } } node f;f.n=1;f.m=2*n;f.a[1][n+1]=1; node t=a*b;t=quick(t,(m-1)/2);f=f*t; if(m%2==0) { if(n!=1) printf("%lld",(f.a[1][2*n]+f.a[1][2*n-1])%mod); else printf("%lld",f.a[1][2*n]); } else { if(n!=1) printf("%lld",(f.a[1][n]+f.a[1][n-1])%mod); else printf("%lld",f.a[1][n]); }}
阅读全文
1 0
- bzoj 4417: [Shoi2013]超级跳马
- bzoj 4417: [Shoi2013]超级跳马
- BZOJ 4417: [Shoi2013]超级跳马【矩阵快速幂优化dp
- bzoj 4417: [Shoi2013]超级跳马(矩阵合并+快速幂)
- [bzoj4417][SHOI2013]超级跳马
- BZOJ4417 [Shoi2013]超级跳马
- bzoj4417: [Shoi2013]超级跳马
- 矩阵乘 [Shoi2013]超级跳马
- 4417: [Shoi2013]超级跳马|DP+矩阵快速幂
- 【BZOJ】4419: [Shoi2013]发微博
- bzoj 4419: [Shoi2013]发微博
- BZOJ 4419 [Shoi2013]发微博
- BZOJ 4419: [Shoi2013]发微博
- bzoj 4415: [Shoi2013]发牌
- bzoj 4415: [Shoi2013]发牌
- bzoj 4415: [Shoi2013]发牌
- [BZOJ 4416][Shoi2013]阶乘字符串
- bzoj 4419: [Shoi2013]发微博 乱搞
- php编译时错误 WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP
- Windows转Linux,相关替换软件
- Karaf教程第4部分 OSGi中的CXF服务
- Raspberry Pi 3B开箱踩坑记录
- type=file按钮样式改造
- bzoj 4417: [Shoi2013]超级跳马
- 招聘、招聘,我就这样被算法选中
- RecyclerView的点击事件
- iconfont字体图标的使用方法--超简单! 我之前因为项目用bootstrap比较多,所以使用font awesome字体图标比较多,后来接触到了iconfont,发现想要的什么图标都有,还可以
- 重定向和用户会话
- PAT 乙级 1029.旧键盘(20)
- SCUT第四次训练赛(归并排序 sort 搜索 搜索2 并查集 高精度乘法 二分 Dating with girls(1) 均分纸牌 导弹拦截 A + B Problem II)
- 博士可能是所有学生群体里被黑最猛烈的
- 如何配置mybatis XML文件属性快捷提示方式