【矩阵快速幂】ZOJ 3690 Choosing number
来源:互联网 发布:英国海军实力知乎 编辑:程序博客网 时间:2024/05/21 20:26
矩阵快速幂。。。顾名思义就是利用矩阵的结合律来进行快速幂运算。。。嘛,笔者也是做这道题两小时前把矩阵快速幂搞明白了的。。。所以其实还不熟= =
题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3690
首先我们的思路是建立矩阵的转换式,由题意可知在n个数中只有大于k的数字才能相邻,那么其实就是大于k的数字可以随便放啦。
所以令当前选择的数字大于k的部分为a,小于k的部分为b;则有:
| m-k m-k | | An | | An+1 |
| k k-1 | * | An+1 | = | An+2 | (原谅我不会画矩阵。。。)
然后就是这样,代码如下
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#define LL long longusing namespace std;struct mat{ LL a,b; LL c,d;}ans,w;LL n,m,k;const int mod=1000000007;mat mix(mat a,mat b){ mat ans; ans.a=(a.a*b.a+a.b*b.c)%mod; ans.b=(a.a*b.b+a.b*b.d)%mod; ans.c=(a.c*b.a+a.d*b.c)%mod; ans.d=(a.c*b.b+a.d*b.d)%mod; return ans;}int main(){while(~scanf("%lld%lld%lld",&n,&m,&k)){ w.a=w.b=m-k; w.c=k; w.d=k-1; ans.a=ans.d=1; ans.b=ans.c=0; n--; while(n) { if(n&1) ans=mix(w,ans); w=mix(w,w); n=n>>1; //cout<<ans.a<<" "<<ans.b<<endl; //cout<<ans.c<<" "<<ans.d<<endl<<endl; } printf("%lld\n",((ans.a+ans.c)*(m-k)%mod+(ans.b+ans.d)*k%mod)%mod);}return 0;}
0 0
- 矩阵快速幂 zoj-3690 Choosing number
- ZOJ - 3690 Choosing number 矩阵快速幂
- 【矩阵快速幂】ZOJ 3690 Choosing number
- 【ZOJ 3690】 Choosing number (矩阵快速幂)
- zoj 3690 Choosing number 递推+矩阵快速幂
- ZOJ 3690 Choosing number(矩阵快速幂)
- ZOJ 3690 Choosing number(矩阵快速幂)
- zoj 3690 Choosing number(矩阵乘法+dp)
- BNU Choosing number 矩阵快速幂
- zoj3690--Choosing number(dp,矩阵快速幂)
- BNUOJ28891 Choosing number(矩阵快速幂)
- zoj 3690 Choosing number
- ZOJ 3690 Choosing number
- ZOJ 3690 Choosing number
- ZOJ 3690 Choosing number(dp矩阵优化)
- ZOJ 2105 Number Sequence(矩阵快速幂)
- zoj3690 Choosing number 矩阵
- ZOJ 2105 Number Sequence(矩阵快速幂)
- DOM知识点归纳一
- 星际之门(一)(凯莱定理+快速幂)
- 开发经验总结-点滴积累
- Hibernate4查询的占位提示
- 【Hadoop系列】第二章:安装Hadoop(上)单机版Hadoop
- 【矩阵快速幂】ZOJ 3690 Choosing number
- 如何在android studio中导入外部包
- 预言性的基于事例推理技术
- 打印菱形 字母金字塔和杨辉三角
- ScopeGuard
- MapReduce原理及运行流程回顾
- cmd 连接db2
- php exec python script not working [Solved]
- [异能程序员]第三章 异能初现(第三更)