快速幂
快速幂
快速幂的实质就是通过合并项来减少幂的运算次数,从而在O(logn)的时间复杂度内完成运算。
比如:
在这个计算式中,如果不加优化,2^16要计算16次才能得出答案。然而发现这个式子中有很多相同的2*2计算,如果利用计算出的2*2,把所有的2*2项合并起来,然后幂的次数/2,这样就可以优化很多计算,后面类推。
#include<bits/stdc++.h> using namespace std; #define ll long long int a, b, p; int main() { cin >> a >> b >> p; int aa = a, bb = b; ll ans = 1; while (b) { if (b % 2 == 1) { ans = (ll)ans * a % p; } b /= 2; a = (ll) a * a % p; } printf("%d^%d mod %d=%ld\n", aa, bb, p, ans); return 0; }
矩阵快速幂
1.矩阵乘法
for(i = 1; i <= r; i ++) { for(j = 1; j <= c; j ++) { mul[i][j] = 0; for(k = 1; k <= c; k ++) { mul[i][j] += a[i][k] * b[k][j]; } } }
2.重载运算符
matrix operator *(const matrix &x, const matrix &y) { matrix z; for(int i = 1; i <= n; i ++) { for(int j = 1; j <= n; j ++) { for(int k = 1; k <= n; k ++) { z.a[i][j] = (z.a[i][j] + x.a[i][k] * y.a[k][j] % mod) % mod; } } } return z; }
3.单位矩阵
误区:单位矩阵是左上右下对角线上元素全为1,并不是所有元素全为1。
struct matrix { ll a[maxn][maxn]; matrix() { memset(a, 0, sizeof(a)); } //构造单位矩阵 inline void build() { for(int i = 1; i <= n; i ++) { a[i][i] = 1; } } };
#include<bits/stdc++.h> using namespace std; #define ll long long const int maxn = 150; const int mod = 1e9 + 7; int n; ll k; struct matrix { ll a[maxn][maxn]; matrix() { memset(a, 0, sizeof(a)); } //构造单位矩阵 inline void build() { for(int i = 1; i <= n; i ++) { a[i][i] = 1; } } }m; //重载运算符 matrix operator *(const matrix &x, const matrix &y) { matrix z; for(int i = 1; i <= n; i ++) { for(int j = 1; j <= n; j ++) { for(int k = 1; k <= n; k ++) { z.a[i][j] = (z.a[i][j] + x.a[i][k] * y.a[k][j] % mod) % mod; } } } return z; } int main() { cin >> n >> k; for (int i = 1; i <= n; i ++) { for (int j = 1; j <= n; j ++) { cin >> m.a[i][j]; } } matrix ans; ans.build(); while(k) { if(k & 1) {//奇数(不能被2整除) ans = ans * m; } k >>= 1; m = m * m; } for(int i = 1; i <= n; i ++) { for(int j = 1; j <= n; j ++) { cout << ans.a[i][j] << " "; } cout << "\n"; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?