hdu4565 So Easy!(矩阵快速幂)
来源:互联网 发布:软件项目管理办法 编辑:程序博客网 时间:2024/05/29 14:47
题意:
告诉你a,b,n,m,求
0<a,m<2^15 , (a-1)^2<b<a^2 , 0<b,n<2^31
解题思路:
我们首先对(a+sqrt(b))^n进行处理,由a+sqrt(b))^n的展开式我们可以知道
(a+sqrt(b))^n = Xn + Yn * sqrt(b);
那么
( a + sqrt( b ) )^( n + 1 ) = ( a + sqrt( b ) ) * ( Xn + Yn * sqrt(b) ) = ( a * Xn + b * Yn ) + ( a * Yn + Xn ) * sqrt( b );
则
Xn+1 = ( a * Xn + b * Yn )
Yn+1 = ( a * Yn + Xn )
将其转化为矩阵,则
递推下去可以得到
所以
Xn = a * X0 + b * Y0;
Yn = X0 + a * Y0;
由于 (a-1)^2<b<a^2 ,
那么 0 < ( a - sqrt( b ) )^ n < 1
又 ( a + sqrt( b ) )^ n + ( a - sqrt( b ) )^ n = 2 * Xn
那么 ( a + sqrt( b ) )^ n 向上取整的值就是 2 * Xn
最终
Sn = ( 2 * Xn )% m;
参考代码:
#include <iostream>#include <math.h>#include <stdio.h>using namespace std;typedef long long ll;struct Matrix{ll mat[2][2];};Matrix mul(Matrix a,Matrix b,ll mod){Matrix ans;for (int i=0;i<2;i++){for (int j=0;j<2;j++){ans.mat[i][j]=0;for (int k=0;k<2;k++){ans.mat[i][j]=(ans.mat[i][j]+a.mat[i][k]*b.mat[k][j]);ans.mat[i][j]%=mod;}}}return ans;}Matrix Init(){Matrix ans;for (int i=0;i<2;i++){for (int j=0;j<2;j++){if (i==j)ans.mat[i][j]=1;elseans.mat[i][j]=0;}}return ans;}Matrix exp(Matrix a,ll k,ll m){Matrix ans=Init();while (k){if (k&1)ans=mul(ans,a,m);a=mul(a,a,m);k>>=1;}return ans;}int main(){Matrix M;ll a,b,n;ll m;while (~scanf("%lld%lld%lld%lld",&a,&b,&n,&m)){M.mat[0][0]=M.mat[1][1]=a;M.mat[0][1]=b;M.mat[1][0]=1;Matrix ans=exp(M,n,m);/*for (int i=0;i<2;i++){for (int j=0;j<2;j++)cout<<ans.mat[i][j]<<" ";cout<<endl;}*/ll x=ans.mat[0][0];cout<<(2*x)%m<<endl;}return 0;}
1 0
- hdu4565 So Easy!(矩阵快速幂)
- HDU4565 So Easy!【矩阵快速幂】
- 20130707 hdu4565 So Easy! 数学头脑+矩阵快速幂
- HDU4565 So Easy! 矩阵快速幂外加数学
- HDU4565-So Easy!(共轭运用+矩阵快速幂)
- HDU4565 So Easy!(数学+矩阵快速幂)
- HDU4565-So easy-数学推导化简递推矩阵快速幂
- HDU4565---So Easy!(矩阵快速幂(精度控制))
- hdu4565---So Easy!(矩阵)
- HDU4565 So Easy! (矩阵)
- hdu4565 so easy 矩阵
- hdu4565 So Easy! 广义斐波那契+矩阵快速幂+共轭构造
- So Easy! ——————hdu4565(矩阵快速幂)
- HDU4565 So Easy!【矩阵连乘】【推导】
- hdu4565 矩阵快速幂
- hdu4565(矩阵快速幂)
- HDU4565 So Easy!
- HDU4565 So Easy!
- Git 学习
- iOS开发:保持程序在后台长时间运行
- MySQL数据类型及范围用法一览表
- 手斧Linux – 从LFS到Funtoo (154)
- BCP 简 要 说 明
- hdu4565 So Easy!(矩阵快速幂)
- Android:关于声明文件中android:process属性说明
- Oracle创建存储过程、创建函数、创建包
- 手斧Linux – 从LFS到Funtoo (155)
- 【异步任务AsyncTask】
- C#建立最简单的web服务,无需IIS
- Java - Thinking in Java 第3章 操作符
- Linux 下如何处理包含空格和特殊字符的文件名
- 问题解决 —— Jsp界面之间传参乱码