分治——取余运算(mod)

问题 H: 【例7.5】 取余运算(mod)

时间限制: 1 Sec  内存限制: 128 MB

题目描述

输入b,p,k的值,求bp mod k的值。其中b,p,k*k为长整型数。
### 高效计算斐波那契数列第N项并模 对于高效计算斐波那契数列的第N项并且对大数模的操作,在信息学竞赛中是一个常见的题目。考虑到直接递归效率低下,可以采用矩阵快速幂方法来优化时间复杂度到O(log N),这使得处理非常大的`n`成为可能。 #### 使用矩阵快速幂求解斐波那契数列 斐波那契数列可以通过下面的状态转移方程表示: \[ \begin{bmatrix} F(n) \\ F(n-1) \end{bmatrix} = M^{(n-1)} * \begin{bmatrix} 1 \\ 0 \end{bmatrix},\quad 其中M=\begin{bmatrix} 1 & 1\\ 1 & 0 \end{bmatrix} \] 为了防止数值溢出,每次运算的结果都需要对给定的大素数\(p=1,000,000,007\)操作[^2]。 下面是具体的C++代码实现方式: ```cpp #include <iostream> using namespace std; const int MOD = 1e9 + 7; struct Matrix { long long mat[2][2]; }; Matrix matrixMultiply(const Matrix& a, const Matrix& b){ Matrix ret{}; for (int i = 0; i < 2; ++i) for (int j = 0; j < 2; ++j) for(int k = 0;k<2;++k) ret.mat[i][j]=(ret.mat[i][j]+a.mat[i][k]*b.mat[k][j])%MOD; return ret; } // 计算矩阵A的n次幂 Matrix fastPower(Matrix A, int n){ Matrix res{}, base=A; res.mat[0][0]=res.mat[1][1]=1; while(n>0){ if(n&1) res=matrixMultiply(res,base); base=matrixMultiply(base,base); n>>=1; } return res; } long long fibMod(long long n){ if(n==0)return 0; Matrix m={{1,1},{1,0}}; Matrix ans=fastPower(m,n-1); return ans.mat[0][0]%MOD; } ``` 此段程序通过定义了一个辅助结构体`Matrix`用于存储二阶方阵,并实现了两个主要功能函数——`matrixMultiply()`负责两矩阵相乘后的结果仍保持在模意义下;而`fastPower()`则利用分治的思想加速了指数级别的连乘过程。最后由入口函数`fibMod()`调用来获得最终答案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值