POJ3233Matrix Power Series(矩阵快速幂)
题意
给出n×n的矩阵A,求∑ki=1Ai,每个元素对m取模
Sol
考虑直接分治
当k为奇数时
∑ki=1Ai=∑k/2+1i=1Ai+Ak/2+1(∑k/2i=1Ai)
当k为偶数时
sumki=1=∑k/2i=1Ai+Ak/2(∑k/2i=1Ai)
当然还可以按套路对前缀和构造矩阵也是可以做的。
#include<cstdio> #include<cstring> #include<iostream> #include<map> #define LL long long using namespace std; int N, K, mod; int mul(int x, int y) { if(1ll * x * y > mod) return 1ll * x * y % mod; else return 1ll * x * y; } int add(int x, int y) { if(x + y > mod) return x + y - mod; else return x + y; } struct Matrix { int m[31][31]; Matrix() { memset(m, 0, sizeof(m)); } bool operator < (const Matrix &rhs) const { for(int i = 1; i <= N; i++) for(int j = 1; j <= N; j++) if(m[i][j] != rhs.m[i][j]) return m[i][j] < rhs.m[i][j]; return 1; } Matrix operator * (const Matrix &rhs) const { Matrix ans; for(int k = 1; k <= N; k++) for(int i = 1; i <= N; i++) for(int j = 1; j <= N; j++) ans.m[i][j] = add(ans.m[i][j], mul(m[i][k], rhs.m[k][j])); return ans; } Matrix operator + (const Matrix &rhs) const { Matrix ans; for(int i = 1; i <= N; i++) for(int j = 1; j <= N; j++) ans.m[i][j] = add(m[i][j], rhs.m[i][j]); return ans; } }a; Matrix getbase() { Matrix base; for(int i = 1; i <= N; i++) base.m[i][i] = 1; return base; } Matrix fp(Matrix a, int p) { Matrix base = getbase(); while(p) { if(p & 1) base = base * a; a = a * a; p >>= 1; } return base; } Matrix solve(int k) { if(k == 1) return a; Matrix res = solve(k / 2); if(k & 1) { Matrix po = fp(a, k / 2 + 1); return res + po + po * res; } else return res + fp(a, k / 2) * res; } main() { // freopen("a.in", "r", stdin); cin >> N >> K >> mod; for(int i = 1; i <= N; i++) for(int j = 1; j <= N; j++) cin >> a.m[i][j]; Matrix ans = solve(K); for(int i = 1; i <= N; i++, puts("")) for(int j = 1; j <= N; j++) printf("%d ", ans.m[i][j] % mod); }
作者:自为风月马前卒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步