对于数列S(n) = a + a^2 + a^3 +....+ a^n;

可以用二分的思想进行下列的优化。

if(n & 1)

  S(n) = a + a^2 + a^3 + ....... + a^n;

  = a + a^2 + a^3 +..+ a^((n-1) / 2) + a^((n-1) / 2 + 1) + a^((n-1) / 2 + 2) + ... + a^((n-1) / 2 + (n-1) / 2) + a^((n-1) / 2 + (n-1) / 2 + 1);

  = (1 + a^((n-1) / 2 + 1)) * S((n-1)/2) + a^((n-1) / 2 + 1)

else

  S(n) = a + a^2 + a^3 + ....... + a^n;

  = a + a^2 + a^3 +..+ a^((n / 2) + a^(n / 2 + 1) + a^(n / 2 + 2) + ... + a^(n/ 2 + n / 2);

  = (1 + a^(n / 2)) * S(n / 2);

这样就可以避免矩阵的除法了! 还有就是MOD真的很慢。

  1. #include<map>
  2. #include<set>
  3. #include<string>
  4. #include<queue>
  5. #include<stack>
  6. #include<cmath>
  7. #include<vector>
  8. #include<cstdio>
  9. #include<time.h>
  10. #include<cstring>
  11. #include<iostream>
  12. #include<algorithm>
  13. #define INF 1000000001
  14. #define ll long long
  15. #define lson l,m,rt<<1
  16. #define rson m+1,r,rt<<1|1
  17. using namespace std;
  18. const int MAXN = ;
  19. struct Mat
  20. {
  21. ll a[][];
  22. }E;
  23. int n,k,MOD;
  24. Mat Matadd(Mat a,Mat b)
  25. {
  26. Mat c;
  27. for(int i = ; i < n; i++){
  28. for(int j = ; j < n; j++){
  29. c.a[i][j] = (a.a[i][j] + b.a[i][j])%MOD;
  30. }
  31. }
  32. return c;
  33. }
  34. Mat Matmul(Mat a,Mat b)
  35. {
  36. Mat c;
  37. for(int i = ; i < n; i++){
  38. for(int j = ; j < n; j++){
  39. c.a[i][j] = ;
  40. for(int k = ; k < n; k++){
  41. c.a[i][j] += (a.a[i][k] * b.a[k][j])%MOD;
  42. }
  43. c.a[i][j] %= MOD;
  44. }
  45. }
  46. return c;
  47. }
  48. Mat power(Mat a,int n)
  49. {
  50. Mat c;
  51. c = E;
  52. while(n){
  53. if(n & ){
  54. c = Matmul(c,a);
  55. }
  56. a = Matmul(a,a);
  57. n >>= ;
  58. }
  59. return c;
  60. }
  61. Mat sum(Mat a,int k)//求S(k)
  62. {
  63. if(k == )return a;
  64. Mat t = sum(a,k/);//S(k/2)
  65. if(k & ){
  66. Mat cur = power(a,k/ + );//a^(k/2 + 1)
  67. t = Matadd(t,Matmul(t,cur));//(1 + a^(k/2+1))*S(k/2)
  68. t = Matadd(t,cur);//(1 + a^(k/2 + 1))*S(k/2)
  69. }
  70. else {
  71. Mat cur = power(a,k/);//a^(k/2)
  72. t = Matadd(t,Matmul(t,cur));//(1 + a^(k/2))*S(k/2)
  73. }
  74. return t;
  75. }
  76. int main()
  77. {
  78. while(scanf("%d%d%d",&n,&k,&MOD) != EOF){
  79. Mat a;
  80. memset(E.a,,sizeof(E.a));
  81. for(int i = ; i < n; i++)E.a[i][i] = ;
  82. for(int i = ; i < n; i++){
  83. for(int j = ; j < n; j++){
  84. scanf("%lld",&a.a[i][j]);
  85. a.a[i][j] %= MOD;
  86. }
  87. }
  88. Mat ans = sum(a,k);
  89. for(int i = ; i < n; i++){
  90. for(int j = ; j < n; j++){
  91. if(j == )printf("%lld",ans.a[i][j]);
  92. else {
  93. printf(" %lld",ans.a[i][j]);
  94. }
  95. }
  96. printf("\n");
  97. }
  98. }
  99. return ;
  100. }

poj3233 矩阵等比数列求和 二分的更多相关文章

  1. HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

    HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意:  g(i)=k*i+b;i为变量.  给出 ...

  2. HDU 2254 奥运(矩阵高速幂+二分等比序列求和)

    HDU 2254 奥运(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意:  中问题不解释. 分析:  依据floyd的算法,矩阵的k次方表示这个矩阵走了k步.  所以k ...

  3. POJ 1845 (约数和+二分等比数列求和)

    题目链接: http://poj.org/problem?id=1845 题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1) ...

  4. luogu1397 [NOI2013]矩阵游戏 (等比数列求和)

    一个比较显然的等比数列求和,但有一点问题就是n和m巨大.. 考虑到他们是在幂次上出现,所以可以模上P-1(费马小定理) 但是a或c等于1的时候,不能用等比数列求和公式,这时候就要乘n和m,又要变成模P ...

  5. hoj3152-Dice 等比数列求和取模

    http://acm.hit.edu.cn/hoj/problem/view?id=3152 Dice My Tags (Edit) Source : Time limit : sec Memory ...

  6. Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)

    题目链接:http://codeforces.com/problemset/problem/963/A 题目大意:就是给了你n,a,b和一段长度为k的只有'+'和‘-’字符串,保证n+1被k整除,让你 ...

  7. bzoj 4555 [Tjoi2016&Heoi2016]求和 NTT 第二类斯特林数 等比数列求和优化

    [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 679  Solved: 534[Submit][S ...

  8. ZOJ-3774 Power of Fibonacci——等比数列求和&&等价替换

    题目 求 $\displaystyle \sum_{i=1}^n F_i^k$,($1 \leq n\leq 10^{18},1 \leq  k\leq 10^5$),答案对 $10^9+9$ 取模. ...

  9. 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)

    题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...

随机推荐

  1. jvm虚拟机性能监控与故障处理工具

    java开发人员肯定知道jdk的bin目录中有java.exe javac.exe这两个命令行工具,但并非所有程序员都了解过jdk的bin目录之中其他命令行的作用.jdk的工具,体积都比较小,这些命令 ...

  2. java 25 - 2 网络编程之 网络通信三要素

    网络通信三要素 IP地址: InetAddress 网络中设备的标识,不易记忆,可用主机名(计算机的标识号) 端口号: 用于标识进程的逻辑地址,不同进程的标识(正在运行的软件的标识号) 传输协议: 通 ...

  3. 转: vim 的编辑格式设置

    http://www.cnblogs.com/freewater/archive/2011/08/26/2154602.html :set encoding=utf-8:set fileencodin ...

  4. crontab日常使用梳理

    在日常的运维工作中,对crontab定时任务的制定是再寻常不过的了.根据以往的使用经验梳理如下: 基本格式 :* * * * * command分 时 日 月 周 命令解释:第1列表示分钟1-59 每 ...

  5. 047医疗项目-模块四:采购单模块—采购单审核提交(Dao,Service,Action三层)

    我们之前把采购单都审核了,这篇文章说的就是审核之后提交. 其实就是改变(update)采购单的审核状态. 需求: 用户要先查看采购单的内容. 查看采购单页面:页面布局同采购单修改页面. 选择审核结果. ...

  6. C#TCP通讯框架

    开源的C#TCP通讯框架 原来收费的TCP通讯框架开源了,这是一款国外的开源TCP通信框架,使用了一段时间,感觉不错,介绍给大家 框架名称是networkcomms 作者开发了5年多,目前已经停止开发 ...

  7. grunt使用入门(zz)

    下面介绍grunt的基本使用方法,把前端项目中的对个js文件,合并到一起,并压缩. 注意,例子用的是grunt 0.4.5版本,低版本可能在配置上有所不同. 工具/原料 node 方法/步骤 首先用n ...

  8. ios蓝牙开发(四)app作为外设被连接的实现-转发

    代码下载: 原博客中大部分示例代码都上传到了github,地址是:https://github.com/coolnameismy/demo. 再上一节说了app作为central连接periphera ...

  9. Ionic实战四:ionic 即时通讯_ionic仿雅虎邮箱

    此产品是一款Ionic版微博.微信.朋友圈效果(微博.微信.聊天列表.聊天窗口.个人界面.编辑个人信息等)购买后二次开发方便快捷.    

  10. 【算法之美】你可能想不到的归并排序的神奇应用 — leetcode 327. Count of Range Sum

    又是一道有意思的题目,Count of Range Sum.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/leetcode ...