uva 10870(矩阵快速幂)
来源:互联网 发布:手机淘宝怎么退款 编辑:程序博客网 时间:2024/06/02 19:42
题意:计算f(n)
f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + … + ad f(n - d), for n > d.
题解:斐波那契的变形,把2个扩大成d个,然后加了a1…ad的参数,构造矩阵直接矩阵快速幂计算。
#include <stdio.h>#include <string.h>const int N = 20;struct Mat { long long g[N][N];}res, ori;long long d, n, m;Mat multiply(Mat x, Mat y) { Mat temp; for (int i = 0; i < d; i++) for (int j = 0; j < d; j++) { temp.g[i][j] = 0; for (int k = 0; k < d; k++) temp.g[i][j] = (temp.g[i][j] + x.g[i][k] * y.g[k][j]) % m; } return temp;}void calc(long long n) { while (n) { if (n & 1) ori = multiply(ori, res); n >>= 1; res = multiply(res, res); }}int main() { while (scanf("%lld%lld%lld", &d, &n, &m) && d + n + m) { memset(res.g, 0, sizeof(res.g)); memset(ori.g, 0, sizeof(ori.g)); for (int i = 0; i < d; i++) { scanf("%lld", &res.g[i][0]); res.g[i][0] %= m; if (i > 0) res.g[i - 1][i] = 1; } for (int i = 0; i < d; i++) { scanf("%lld", &ori.g[0][d - 1 - i]); ori.g[0][d - 1 - i] %= m; } calc(n - d); printf("%lld\n", ori.g[0][0]); } return 0;}
0 0
- uva 10870(矩阵快速幂)
- UVA 10870 Recurrences 矩阵快速幂
- UVa 10870 Recurrences / 矩阵快速幂
- UVA 10870 - Recurrences(矩阵快速幂)
- uva 10870 - Recurrences(矩阵快速幂)
- UVA - 10870 Recurrences (矩阵快速幂)
- UVA - 10870 Recurrences 矩阵快速幂
- UVA 10870 (矩阵快速幂)
- uva 10870 Recurrences(矩阵快速幂)
- UVA - 10870 Recurrences (矩阵快速幂)
- UVa - 10870 - Recurrences ( 矩阵快速幂 )
- UVa 10870 Recurrences (矩阵快速幂)
- UVA 10870 Recurrences(矩阵快速幂)
- UVa 10870 - Recurrences (矩阵构造 矩阵快速幂)
- uva 12470(矩阵快速幂)
- uva 10698 矩阵快速幂
- 【矩阵快速幂】Recurrences UVA
- UVA 11551(矩阵快速幂)
- c标签 if else
- windows环境下配置tornado
- traceroute使用问题解决
- MFC解析启动命令行参数——CCommandLineInfo类
- Spark(十二) -- Spark On Yarn & Spark as a Service & Spark On Tachyon
- uva 10870(矩阵快速幂)
- 初学Qt
- 二叉树的递归1
- 黑马程序员-Java面向对象I(概述及三大特征)
- 栈(一)
- Variant-自己写任意类型存储[流输入输出有待改进]
- ArcGIS api for JavaScript V3.13 lib&sdk离线部署
- python的lambda表达式、filter函数、map函数
- 黑马程序员-Java集合