NYOJ301-递推求值
来源:互联网 发布:二氧化碳浓度值 知乎 编辑:程序博客网 时间:2024/03/29 16:19
递推求值
nyoj上矩阵专题里的10道题水了AC率最高的5道,惭愧,还不是完全自己写的,用了几乎两周的时间。模板题我是有自信写出来的,但对于高级一点的矩阵构造,我还是菜的抠脚。
这题感谢MQL大哥和她女票指点,自己想了一天不会构造矩阵,然后两位巨巨一起讨论了一下,瞬间明白了。此题关键就是在于这个矩阵构造。
题意:给出M斐波那契的前两项f[1],f[2],以及递推式:f(x)=a*f(x-2)+b*f(x-1)+c中的a,b,c,和n.求f[n]%1000007。
很裸的矩阵快速幂,但怎么构造这个矩阵呢。摘用远航学长的博客来解释吧:
分析:由于n的值比较大,所以常规方法肯定会超时。根据递推式求第n个表达式的值时,通常用矩阵乘法来做。
本题要构造两个矩阵,其中一个为矩阵A,作为初始矩阵即:假设初始矩阵为A,那么每次都需要乘以下一个矩阵B来得到下一项。
而:f[n]=a*f[n-2]+b*f[n-1]+c,f[n-1]=1*f[n-1]+0*f[n-2]+0*c,c=0*f[n-1]+0*f[n-2]+1*c;
A| f2 0 0 |
| f1 0 0 |
| 1 0 0 |
B
| b a c |
| 1 0 0 |
| 0 0 1 |
因为F(2)和F(1)是已知的,当n>=3时,每次都乘以矩阵B,就能推出下一个矩阵。而矩阵的第一行第一列的元素就是所求的结果。
所以利用矩阵快速幂能够快速准确地求出结果。
由以上就可以很快得出结果了:const ll MOD=1e6+7;const int N=1e3+10;ll x1,x2,aa,bb,cc,n;struct mat{ ll a[3][3];};mat mat_mul(mat x,mat y){ mat res; memset(res.a,0,sizeof(res.a)); for(int i=0; i<3; i++) for(int j=0; j<3; j++) for(int k=0; k<3; k++) res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j])%MOD; return res;}mat mat_fast_pow(mat x,ll k){ mat res; memset(res.a,0,sizeof(res.a)); for(int i=0; i<3; i++) res.a[i][i]=1; while(k) { if(k&1) res=mat_mul(res,x); x=mat_mul(x,x); k=k>>1; } return res;}void solve(){ mat B,A;// memset(B.a,0,sizeof(B.a)); memset(A.a,0,sizeof(A.a)); B.a[0][0]=bb,B.a[0][1]=aa,B.a[0][2]=cc;//构造B矩阵; B.a[1][0]=B.a[2][2]=1; A.a[0][0]=x2,A.a[1][0]=x1,A.a[2][0]=1;//构造初始矩阵A,注意顺序 B=mat_fast_pow(B,n-2);//矩阵快速幂 mat ans=mat_mul(B,A);//相乘 printf("%lld\n",ans.a[0][0]);}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%lld%lld%lld%lld%lld%lld",&x1,&x2,&aa,&bb,&cc,&n); if(aa<0) aa+=MOD;//注意数据范围和题目要求; if(bb<0) bb+=MOD; if(cc<0) cc+=MOD; if(n==1)//特判1和2的情况 { printf("%lld\n",x1); continue; } if(n==2) { printf("%lld\n",x2); continue; } solve(); } return 0;}
0 0
- nyoj301 递推求值
- NYOJ301-递推求值
- nyoj301递推求值
- nyoj301递推求值【矩阵快速幂】
- nyoj301——递推求值
- 【矩阵快速幂】nyoj301 递推求值
- NYOJ301 递推求值(矩阵快速幂)
- nyoj301-递推求值(矩阵模乘)
- nyoj301 递推求值(矩阵快速幂)
- NYOJ301递推求值 NYOJ 1000又见斐波那契数列(矩阵快速幂)
- acm-递推求值
- 蓝桥杯 递推求值
- 递推求值
- 递推求值
- 蓝桥杯-递推求值
- 递推求值
- 递推求值
- nyoj 301 递推求值
- Androdi--RSA加密和服务器不一致
- 轻松把玩HttpClient之封装HttpClient工具类(九),添加多文件上传功能
- 小问题
- Maven私服Nexus,无法更新jar
- 大型网站系统架构演化之路
- NYOJ301-递推求值
- IOS 开发中判断字符串是否为空字符的方法
- Pytho基础学习--第十篇(函数式编程)
- 大话数据结构学习1-数据结构绪论
- Android系统Surface机制的SurfaceFlinger服务对帧缓冲区FrameBuffer的管理分析
- Java中的构造器、继承、多态知识
- The new powerful SQL executing schedule monthly or weekly in DB Query Analyzer 7.01
- 四、引入mybatis连接数据库(补充)
- MFC 标题栏动态加载自定义图标