bzoj 4417: [Shoi2013]超级跳马(矩阵合并+快速幂)
来源:互联网 发布:js控制浏览器最小宽度 编辑:程序博客网 时间:2024/05/29 07:52
4417: [Shoi2013]超级跳马
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 410 Solved: 252
[Submit][Status][Discuss]
Description
现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角。每一步它向右跳奇数列,且跳到本行或相邻行。跳越期间,马不能离开棋盘。例如,当n = 3, m = 10时,下图是一种可行的跳法。
试求跳法种数mod 30011。
Input
仅有一行,包含两个正整数n, m,表示棋盘的规模。
Output
仅有一行,包含一个整数,即跳法种数mod 30011。
Sample Input
3 5
Sample Output
10
一看n那么小m那么大就可以猜到是一个n*n级别的矩阵自乘m次
但这题还是比较难的,至少比一般的矩阵快速幂难
为方便先调换n和m:
设dp1[x][y]为到达第x行第y列+到达第x-2行第y列+…+到达第1(or2)行第y列的情况总数
dp2[x][y]为到达第x-1行第y列+到达第x-3行第y列+…+到达第2(or1)行第y列的情况总数
如果看不懂就看下面的图吧,假设每个格子上的数字是到达该格子的情况总数
n = 5,m = 5
1 2 3 4 5
1 3 5 7 9
2 4 7 9 9
3 5 6 7 8
1 9 8 9 9
那么dp1[5][4]就是上面红色数字之和,dp2[5][4]和dp1[4][4]就是上面蓝色数字之和
那么可以得到转移:
dp1[x][y] = dp1[x-1][y]+dp1[x-1][y-1]+dp1[x-1][y+1]+dp2[x-1][y]
dp2[x][y] = do1[x-1][y]
最后答案就是dp1[n][m]-dp2[n-1][m]
假设n=3,可以构造出下面矩阵
之后就是愉快的矩阵快速幂了
#include<stdio.h>#include<stdlib.h>#include<string.h>#define mod 30011int n;typedef struct{int i, j;int a[105][105];void init(){memset(a, 0, sizeof(a));for(i=1;i<=n/2;i++){for(j=1;j<=n/2;j++){if(abs(i-j)<=1)a[i][j] = 1;}}for(i=n/2+1;i<=n;i++)a[i][i-n/2] = a[i-n/2][i] = 1;}void unit(){memset(a, 0, sizeof(a));for(i=1;i<=n;i++)a[i][i] = 1;}}Matrix;Matrix Powto(Matrix p, int k);Matrix Jjcf(Matrix p1, Matrix p2);int main(void){int m;Matrix Jz, A, B;scanf("%d%d", &n, &m);if(m==1){if(n==1)printf("1\n");elseprintf("0\n");}else{n *= 2;Jz.init();A = Powto(Jz, m-2);B = Jjcf(A, Jz);printf("%lld\n", (B.a[1][n/2]-A.a[1][n]+mod)%mod);}return 0;}Matrix Powto(Matrix p, int k){Matrix E;E.unit();while(k){if(k%2)E = Jjcf(E, p);p = Jjcf(p, p);k /= 2;}return E;}Matrix Jjcf(Matrix p1, Matrix p2){Matrix pe;int i, j, k;memset(pe.a, 0, sizeof(pe.a));for(i=1;i<=n;i++){for(j=1;j<=n;j++){for(k=1;k<=n;k++)pe.a[i][j] = (pe.a[i][j]+p1.a[i][k]*p2.a[k][j])%mod;}}return pe;}
阅读全文
1 0
- bzoj 4417: [Shoi2013]超级跳马(矩阵合并+快速幂)
- BZOJ 4417: [Shoi2013]超级跳马【矩阵快速幂优化dp
- 4417: [Shoi2013]超级跳马|DP+矩阵快速幂
- bzoj 4417: [Shoi2013]超级跳马
- bzoj 4417: [Shoi2013]超级跳马
- 矩阵乘 [Shoi2013]超级跳马
- [bzoj4417][SHOI2013]超级跳马
- BZOJ4417 [Shoi2013]超级跳马
- bzoj4417: [Shoi2013]超级跳马
- bzoj4417 超级跳马 矩阵乘法
- bzoj 4419: [Shoi2013]发微博 (STL)
- BZOJ 4547 矩阵快速幂
- BZOJ 3240 构造矩阵+矩阵快速幂
- BZOJ 1898 构造矩阵+矩阵快速幂
- 【BZOJ】4419: [Shoi2013]发微博
- bzoj 4419: [Shoi2013]发微博
- BZOJ 4419 [Shoi2013]发微博
- BZOJ 4419: [Shoi2013]发微博
- JavaScript预编译过程理解
- 心情
- Nginx和Tomcat集群部署
- source insight 高亮显示字符串的引用情况
- [leetcode] 442. Find All Duplicates in an Array
- bzoj 4417: [Shoi2013]超级跳马(矩阵合并+快速幂)
- 栈和队列的应用
- [算法分析与设计] leetcode 每周一题: Find Right Interval
- Linux gensub函数用法
- 数据仓库与联机分析处理笔记
- hdu_2004 成绩转换
- 因子分析(Factor Analysis Model)算法推导
- Ubuntu下Nginx配置Https
- ActiveMQ消息持久化