博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu4565 So Easy!(矩阵快速幂)
阅读量:2440 次
发布时间:2019-05-10

本文共 1483 字,大约阅读时间需要 4 分钟。

题意:
告诉你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 * X
0 + b * Y
0;
Yn = X
0 + a * Y
0;

由于 (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 
#include
#include
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; else ans.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<
<<" "; cout<
你可能感兴趣的文章
如何安装svelte_如何在Svelte中动态应用CSS
查看>>
c#枚举类型_C枚举类型
查看>>
如何在数据库中存储用户密码_如何在数据库中存储密码
查看>>
gatsby_使用Gatsby加载外部JS文件
查看>>
窗口怎么退出扩展窗口_如何创建退出意图弹出窗口
查看>>
docker删除映像_如何将更改提交到Docker映像
查看>>
本地ssl证书生成_如何生成本地SSL证书
查看>>
c语言中的null_如何在C中使用NULL
查看>>
如何在macOS中安装本地SSL证书
查看>>
axios 请求嵌入请求_如何对每个Axios请求强制使用凭据
查看>>
检查node.js版本_如何在运行时检查当前的Node.js版本
查看>>
如何安装svelte_如何在Svelte模板中模拟for循环
查看>>
jsp打印画布_如何将画布打印到数据URL
查看>>
javascript 逗号_如何使用JavaScript将逗号更改为点
查看>>
在JavaScript中,如何判断值的类型?
查看>>
docker删除映像_从命令行使用Docker映像
查看>>
npm 云函数_如何在Netlify函数中使用npm软件包
查看>>
使用Docker Desktop管理容器
查看>>
如何在JavaScript中交换两个数组元素
查看>>
小程序 画布未加载_如何在HTML画布中加载图像
查看>>