妈妈呀....这简直是目前死得最惨的一次。

贴题目:

http://poj.org/problem?id=3233

Matrix Power Series
Time Limit: 3000MS Memory Limit: 131072K
Total Submissions: 19128 Accepted: 8068

Description

Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.

Input

The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.

Output

Output the elements of S modulo m in the same way as A is given.

Sample Input

  1. 2 2 4
  2. 0 1
  3. 1 1

Sample Output

  1. 1 2
  2. 2 3

Source

POJ Monthly--2007.06.03, Huang, Jinsong
首先我在克服重重困难后解决了矩阵的问题(工商管理第一学期还不学线性代数2333333)
 
原来的代码:
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <cmath>
  10. #include <cstdlib>
  11.  
  12. #define rep(i,a,n) for(int i = a;i <= n;i++)
  13. #define per(i,n,a) for(int i = n;i>=a;i--)
  14. #define pb push_back
  15. #define VI vector<int>
  16. #define QI queue<int>
  17. #define logM(N) log10(N)/log10(M)
  18. #define eps 1e-8
  19.  
  20. typedef long long ll;
  21.  
  22. using namespace std;
  23.  
  24. int n,m,k;
  25.  
  26. struct node{
  27. ll mat[][];
  28. }h,sum;
  29.  
  30. node operator * (const node &a,const node &b){
  31. node ret;
  32. memset(ret.mat,,sizeof(ret.mat));
  33. rep(i,,n-){
  34. rep(j,,n-){
  35. rep(k,,n-){
  36. ret.mat[i][j] += (a.mat[i][k] * b.mat[k][j])%m;
  37. //cout<<"a.mat["<<i<<"]["<<k<<"]="<<a.mat[i][k]<<" b.mat["<<k<<"]["<<j<<"]="<<b.mat[k][j]<<endl;
  38. //cout<<"i = "<<i<<" j = "<<j<<" ret.mat["<<i<<"]["<<j<<"]="<<ret.mat[i][j]<<endl;
  39. }
  40. if(ret.mat[i][j] > m) ret.mat[i][j] %= m;
  41. }
  42. }
  43. return ret;
  44. }
  45.  
  46. node operator + (const node &a,const node &b){
  47. node ret;
  48. memset(ret.mat,,sizeof(ret.mat));
  49. rep(i,,n-){
  50. rep(j,,n-){
  51. ret.mat[i][j] = a.mat[i][j] + b.mat[i][j];
  52. if(ret.mat[i][j] > m) ret.mat[i][j] %= m;
  53. }
  54. }
  55. return ret;
  56. }
  57.  
  58. void pow_mod(int x){
  59. x--;
  60. node a,b;
  61. a = b = h;
  62. while(x){
  63. if(x&) a = a * b;
  64. b = b * b;
  65. x >>= ;
  66. }
  67. /*cout<<"========"<<endl;
  68. rep(i,0,n-1){
  69. rep(j,0,n-1){
  70. printf("%d ",a.mat[i][j]);
  71. }puts("");
  72. }
  73. cout<<"========"<<endl;
  74. */
  75. sum = sum + a;
  76. }
  77.  
  78. int main()
  79. {
  80. #ifndef ONLINE_JUDGE
  81. freopen("in.txt","r",stdin);
  82. //freopen("out.txt","w",stdout);
  83. #endif
  84. while(~scanf("%d%d%d",&n,&k,&m)){
  85. memset(sum.mat,,sizeof(sum.mat));
  86. rep(i,,n-){
  87. rep(j,,n-){
  88. scanf("%I64d",&h.mat[i][j]);
  89. }
  90. }
  91. rep(i,,k){
  92. pow_mod(i);
  93. }
  94. rep(i,,n-){
  95. rep(j,,n-){
  96. if(j != n-){
  97. printf("%I64d ",sum.mat[i][j]%m);
  98. }
  99. else{
  100. printf("%I64d\n",sum.mat[i][j]%m);
  101. }
  102. }
  103. }
  104. }
  105. return ;
  106. }
其实在这边代码之前已经错了十多遍了。看了学姐的代码,也仔细审视了自己的代码。总的小小的零零碎碎的错误找出不少。
现在这个代码的情况就是TLE
估计里面的测试数据很大,还得优化一下,那么还可以优化的地方就是求sum这个地方。
原理直接盗用学姐给的图片:
优化之后的代码:
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <cmath>
  10. #include <cstdlib>
  11.  
  12. #define rep(i,a,n) for(int i = a;i <= n;i++)
  13. #define per(i,n,a) for(int i = n;i>=a;i--)
  14. #define pb push_back
  15. #define VI vector<int>
  16. #define QI queue<int>
  17. #define logM(N) log10(N)/log10(M)
  18. #define eps 1e-8
  19.  
  20. typedef long long ll;
  21.  
  22. using namespace std;
  23.  
  24. int n,m,k;
  25.  
  26. struct node{
  27. ll mat[][];
  28. }h,sum;
  29.  
  30. node operator * (const node &a,const node &b){
  31. node ret;
  32. memset(ret.mat,,sizeof(ret.mat));
  33. rep(i,,n-){
  34. rep(j,,n-){
  35. rep(k,,n-){
  36. ret.mat[i][j] += (a.mat[i][k] * b.mat[k][j])%m;
  37. }
  38. if(ret.mat[i][j] > m) ret.mat[i][j] %= m;
  39. }
  40. }
  41. return ret;
  42. }
  43.  
  44. node operator + (const node &a,const node &b){
  45. node ret;
  46. memset(ret.mat,,sizeof(ret.mat));
  47. rep(i,,n-){
  48. rep(j,,n-){
  49. ret.mat[i][j] = a.mat[i][j] + b.mat[i][j];
  50. if(ret.mat[i][j] > m) ret.mat[i][j] %= m;
  51. }
  52. }
  53. return ret;
  54. }
  55.  
  56. node pow_mod(int x){
  57. x--;
  58. node a,b;
  59. a = b = h;
  60. while(x){
  61. if(x&) a = a * b;
  62. b = b * b;
  63. x >>= ;
  64. }
  65. return a;
  66. }
  67.  
  68. node work(int p){
  69. if(p == ) return h;
  70. node ret = work(p>>);
  71. ret = ret + ret * pow_mod(p>>);
  72. if(p&) ret = ret + pow_mod(p);
  73. return ret;
  74. }
  75.  
  76. int main()
  77. {
  78. #ifndef ONLINE_JUDGE
  79. //freopen("in.txt","r",stdin);
  80. //freopen("out.txt","w",stdout);
  81. #endif
  82. while(~scanf("%d%d%d",&n,&k,&m)){
  83. memset(sum.mat,,sizeof(sum.mat));
  84. rep(i,,n-){
  85. rep(j,,n-){
  86. scanf("%I64d",&h.mat[i][j]);
  87. }
  88. }
  89. sum = work(k);
  90. rep(i,,n-){
  91. rep(j,,n-){
  92. if(j != n-){
  93. printf("%I64d ",sum.mat[i][j]%m);
  94. }
  95. else{
  96. printf("%I64d\n",sum.mat[i][j]%m);
  97. }
  98. }
  99. }
  100. }
  101. return ;
  102. }

POJ 3233Matrix Power Series的更多相关文章

  1. POJ 3233-Matrix Power Series( S = A + A^2 + A^3 + … + A^k 矩阵快速幂取模)

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

  2. POJ 3233_Matrix Power Series

    题意: 求n*n矩阵的幂和 分析: 逐个加起来时间复杂度太高,通过在矩阵中套个矩阵和,再利用矩阵快速幂,最后时间复杂度为O(n3logn) 代码: #include<cstdio> #in ...

  3. POJ 3233 Matrix Power Series (矩阵乘法)

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

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

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

  5. [ACM] POJ 3233 Matrix Power Series (求矩阵A+A^2+A^3...+A^k,二分求和或者矩阵转化)

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

  6. 矩阵十点【两】 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的迹(就是主对角线上各项的 ...

  7. Poj 3233 Matrix Power Series(矩阵乘法)

    Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Description Given a n × n matrix A and ...

  8. 线性代数(矩阵乘法):POJ 3233 Matrix Power Series

    Matrix Power Series   Description Given a n × n matrix A and a positive integer k, find the sum S = ...

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

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

随机推荐

  1. MVC开发模式下的用户角色权限控制

    前提: MVC开发模式 大概思想: 1.在MVC开发模式下,每个功能都对应着不同的控制器或操作方法名(如修改密码功能可能对应着User/changepd),把每个功能对应的控制器名和操作方法名存到数据 ...

  2. title换行

  3. Docker - 入门

    术语 1. 镜像(image)与容器(container) 镜像是指文件系统快照或tar包. 容器是指镜像的运行态(时) 2.宿主机管理 设置/配置一台物理服务器或虚拟机,以便用于运行Docker容器 ...

  4. 额。。万恶之源就是c

    http://blog.csdn.net/feeltouch/article/details/45155529

  5. excel链接sharepoint 用于 Excel 的 Microsoft Power Query

    https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=39379

  6. iOS 编译时的警告导致无法通过编译

    今天编译react native的代码,发现了2个警告,但是系统却当做错误,不能编译成功,查看了一下编译选项,看到了如下配置: 注意到这个-Werror 了吗? 就是这个标志导致系统把所有的 警告都当 ...

  7. 在VisualStudio 编辑器文本替换中使用正则表达式

    替换时使用正则表达式,其优点在于可以通过正则分组捕获,并在替换字符串中使用. 在VS2012之前的版本中,捕获内容用{}包含,引用时,使用 \1 形式: 在VS2012及以后版本中,捕获内容符合正则表 ...

  8. ios语音识别

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000; min-height: 15.0px } p.p ...

  9. 在ubuntu下安装google chrome

    由于手上有两台电脑,再加上我那个选择困难症加上纠结劲.所以果断把其中一台电脑只装linux系统,另一台电脑只装windows了.免得我老纠结!于是linux便选择了ubuntu. 由于浏览器一直用的是 ...

  10. Redis之清除所有缓存

    方法: /// <summary> /// 清除redis所有缓存 /// </summary> /// <param name="redisUrl" ...