博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[POJ3233] Matrix Power Series(矩阵快速幂)
阅读量:5329 次
发布时间:2019-06-14

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

 

k <= 109 暴力肯定超时

根据矩阵性质,可以发现

S(4) = A1 + A2 + A2 * (A1 + A2)

S(5) = A1 + A2 + A2 * (A1 + A2) + A5

所以可以递归二分求解,分别判断 Ak,k 为奇数和偶数的情况

 

——代码

1 #include 
2 #include
3 4 struct Matrix 5 { 6 int a[30][30]; 7 Matrix() 8 { 9 memset(a, 0, sizeof(a));10 }11 };12 13 int n, k, p;14 Matrix I, P;15 16 inline Matrix operator * (const Matrix x, const Matrix y)17 {18 Matrix ans;19 int i, j, k;20 for(i = 0; i < n; i++)21 for(j = 0; j < n; j++)22 for(k = 0; k < n; k++)23 ans.a[i][j] = (ans.a[i][j] + x.a[i][k] * y.a[k][j]) % p;24 return ans;25 }26 27 inline Matrix operator + (const Matrix x, const Matrix y)28 {29 Matrix ans;30 int i, j;31 for(i = 0; i < n; i++)32 for(j = 0; j < n; j++)33 ans.a[i][j] = (ans.a[i][j] + x.a[i][j] + y.a[i][j]) % p;34 return ans;35 }36 37 inline Matrix operator ^ (Matrix x, int y)38 {39 Matrix ans = I;40 while(y)41 {42 if(y & 1) ans = ans * x;43 x = x * x;44 y >>= 1;45 }46 return ans;47 }48 49 inline Matrix work(Matrix x, int y)50 {51 if(!y) return P;52 Matrix ans = work(x, y >> 1);53 ans = ans + (x ^ (y >> 1)) * ans;54 if(y & 1) ans = ans + (x ^ y);55 return ans; 56 }57 58 int main()59 {60 int i, j;61 Matrix ans;62 for(i = 0; i < 30; i++) I.a[i][i] = 1;63 while(~scanf("%d %d %d", &n, &k, &p))64 {65 for(i = 0; i < n; i++)66 for(j = 0; j < n; j++)67 scanf("%d", &ans.a[i][j]);68 ans = work(ans, k);69 for(i = 0; i < n; i++)70 {71 for(j = 0; j < n; j++) printf("%d ", ans.a[i][j]);72 puts("");73 }74 }75 return 0;76 }
View Code

 

转载于:https://www.cnblogs.com/zhenghaotian/p/6845453.html

你可能感兴趣的文章
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
内存地址对齐
查看>>
创新课程管理系统数据库设计心得
查看>>
Could not resolve view with name '***' in servlet with name 'dispatcher'
查看>>
[转载] redis 的两种持久化方式及原理
查看>>
管道,数据共享,进程池
查看>>
SDUTOJ3754_黑白棋(纯模拟)
查看>>
php中的isset和empty的用法区别
查看>>
把word文档中的所有图片导出
查看>>
ubuntu 18.04取消自动锁屏以及设置键盘快捷锁屏
查看>>
arcgis api 4.x for js 结合 Echarts4 实现散点图效果(附源码下载)
查看>>
YTU 2625: B 构造函数和析构函数
查看>>
apache自带压力测试工具ab的使用及解析
查看>>
加固linux
查看>>
Hyper-V虚拟机上安装一个图形界面的Linux系统
查看>>
js千分位处理
查看>>
字符串类型的相互转换
查看>>
基础学习:C#中float的取值范围和精度
查看>>
web前端面试题2017
查看>>