http://poj.org/problem?id=3233 (题目链接)

题意

  给出一个n×n的矩阵A,求模m下A+A2+A3+…+Ak 的值

Solution

  今日考试就A了这一道题。。

  当k为偶数时,原式=(Ak2+1)×(A1+A2+...+Ak2)。

  当k为奇数的时候将Ak乘上当前答案后抠出去,最后统计答案时再加上。所以我们就一路快速幂搞过去,AC

代码

  1. // poj3233
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<cstdio>
  7. #include<cmath>
  8. #define LL long long
  9. #define inf 2147483640
  10. #define Pi acos(-1.0)
  11. #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  12. using namespace std;
  13.  
  14. const int maxn=31;
  15. int A[maxn][maxn],B[maxn][maxn],C[maxn][maxn],T[maxn][maxn],tmp[maxn][maxn],ans[maxn][maxn],D[maxn][maxn];
  16. int n,m;
  17.  
  18. void pow(int k) {
  19. for (int i=1;i<=n;i++) {
  20. for (int j=1;j<=n;j++) B[i][j]=0,T[i][j]=A[i][j];
  21. B[i][i]=1;
  22. }
  23. while (k) {
  24. if (k&1) {
  25. for (int i=1;i<=n;i++)
  26. for (int j=1;j<=n;j++) {
  27. tmp[i][j]=0;
  28. for (int k=1;k<=n;k++) tmp[i][j]=(tmp[i][j]+B[i][k]*T[k][j])%m;
  29. }
  30. for (int i=1;i<=n;i++)
  31. for (int j=1;j<=n;j++) B[i][j]=tmp[i][j];
  32. }
  33. for (int i=1;i<=n;i++)
  34. for (int j=1;j<=n;j++) {
  35. C[i][j]=0;
  36. for (int k=1;k<=n;k++) C[i][j]=(C[i][j]+T[i][k]*T[k][j])%m;
  37. }
  38. for (int i=1;i<=n;i++)
  39. for (int j=1;j<=n;j++) swap(C[i][j],T[i][j]);
  40. k>>=1;
  41. }
  42. }
  43. void update() {
  44. for (int i=1;i<=n;i++)
  45. for (int j=1;j<=n;j++) {
  46. tmp[i][j]=0;
  47. for (int k=1;k<=n;k++) tmp[i][j]=(tmp[i][j]+ans[i][k]*B[k][j])%m;
  48. }
  49. for (int i=1;i<=n;i++)
  50. for (int j=1;j<=n;j++) ans[i][j]=tmp[i][j];
  51. }
  52. int main() {
  53. int k;
  54. scanf("%d%d%d",&n,&k,&m);
  55. for (int i=1;i<=n;i++)
  56. for (int j=1;j<=n;j++) scanf("%d",&A[i][j]);
  57. memset(ans,0,sizeof(ans));for (int i=1;i<=n;i++) ans[i][i]=1;
  58. while (k>1) {
  59. if (k&1) {
  60. for (int i=1;i<=n;i++)
  61. for (int j=1;j<=n;j++) T[i][j]=A[i][j];
  62. pow(k);
  63. for (int i=1;i<=n;i++)
  64. for (int j=1;j<=n;j++) {
  65. tmp[i][j]=0;
  66. for (int k=1;k<=n;k++) tmp[i][j]=(tmp[i][j]+B[i][k]*ans[k][j])%m;
  67. }
  68. for (int i=1;i<=n;i++)
  69. for (int j=1;j<=n;j++) D[i][j]=(D[i][j]+tmp[i][j])%m;
  70. }
  71. pow(k/2);
  72. for (int i=1;i<=n;i++) B[i][i]=(B[i][i]+1)%m;
  73. update();
  74. k>>=1;
  75. }
  76. for (int i=1;i<=n;i++)
  77. for (int j=1;j<=n;j++) B[i][j]=A[i][j];
  78. update();
  79. for (int i=1;i<=n;i++) {
  80. for (int j=1;j<=n;j++) printf("%d ",(ans[i][j]+D[i][j])%m);
  81. printf("\n");
  82. }
  83. return 0;
  84. }

  

【poj3233】 Matrix Power Series的更多相关文章

  1. 【POJ 3233】Matrix Power Series

    [题目链接] 点击打开链接 [算法] 要求 A^1 + A^2 + A^3 + ... + A^k 考虑通过二分来计算这个式子 : 令f(k) = A^1 + A^2 + A ^ 3 + ... + ...

  2. POJ3233 [C - Matrix Power Series] 矩阵乘法

    解题思路 题目里要求\(\sum_{i=1}^kA^i\),我们不妨再加上一个单位矩阵,求\(\sum_{i=0}^kA^i\).然后我们发现这个式子可以写成这样的形式:\(A(A(A...)+E)+ ...

  3. POJ3233:Matrix Power Series

    对n<=30(其实可以100)大小的矩阵A求A^1+A^2+……+A^K,K<=1e9,A中的数%m. 从K的二进制位入手.K分解二进制,比如10110,令F[i]=A^1+A^2+……+ ...

  4. POJ 3233 Matrix Power Series(二分等比求和)

    Matrix Power Series [题目链接]Matrix Power Series [题目类型]二分等比求和 &题解: 这题我原来用vector写的,总是超时,不知道为什么,之后就改用 ...

  5. 构造矩阵解决这个问题 【nyoj299 Matrix Power Series】

    矩阵的又一个新使用方法,构造矩阵进行高速幂. 比方拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s. ...

  6. POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】

    任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K To ...

  7. 矩阵十点【两】 poj 1575 Tr A poj 3233 Matrix Power Series

    poj 1575  Tr A 主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575 题目大意:A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的 ...

  8. [POJ3233]Matrix Power Series 分治+矩阵

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [POJ3233]Matrix Power Series 分治+矩阵 题目大意 A为n×n(n<= ...

  9. POJ3233 Matrix Power Series 矩阵快速幂 矩阵中的矩阵

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 27277   Accepted:  ...

随机推荐

  1. AppScan8.0简单扫描

    上篇文章介绍了如何在WindowsXP中安装AppScan8.0,接着本篇就来说说怎么进行一次简单的扫描吧. AppScan8.0开始扫描 1.新建扫描,选择“常规扫描”,如下图: (常规.快速.综合 ...

  2. maven总结2

    依赖 maven版本:apache-maven-3.1.1    IDE: springsource   默认支持maven集成             若使用的是eclipse,则需要先安装m2ec ...

  3. svn命令行修改已提交的版本备注

    svn命令行修改已提交的版本备注 参考文章: stackoverflow.com/questions/304383/how-do-i-edit-a-log-message-that-i-already ...

  4. pre标签避免一行过长打破格局

    pre{ white-space:pre-wrap; word-wrap:break-word; word-break:break-all }

  5. Django添加Last-Modified和ETag

    用Django REST Framework做的REST API,其中有个API有这样的需求: APP端请求这个API,服务器端从数据库读数据,返回json.返回的数据量稍微有些大,但是可能一年才修改 ...

  6. LeetCode 笔记27 Two Sum III - Data structure design

    Design and implement a TwoSum class. It should support the following operations: add and find. add - ...

  7. Java第一次实验

    北京电子科技学院(BESTI) 实验报告   课程: java实验    班级:1352     姓名:吕松鸿     学号:20135229  成绩: 指导教师: 娄嘉鹏    实验日期及时间:20 ...

  8. C#中无边框窗体移动

    拖动无边框窗体Form至桌面任何位置 首先建一个Windows应用程序将Form1的 FormBorderStyle属性设置为Noe Point mouseOff;//鼠标移动位置变量 bool le ...

  9. HoloLens开发手记 - Unity之场景共享 Shared holographic experiences in Unity

    佩戴HoloLens的多个用户可以使用场景共享特性来获取集合视野,并可以与固定在空间中某个位置的同一全息对象进行交互操作.这一切是通过空间锚共享(Anchor Sharing)来实现的. 为了使用共享 ...

  10. 【原创】基于Memcached 实现用户登录的Demo(附源码)

    一个简单的Memcached在Net中运用的一个demo.主要技术 Dapper+MVC+Memcached+sqlserver, 开发工具为vs2015+Sql 效果图如下: 登录后 解决方案 主要 ...