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

ACM

题目地址:HDU 1588 Gauss Fibonacci

题意: 

g(i)=k*i+b;i为变量。 

给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值。

分析: 

把斐波那契的矩阵带进去,会发现这个是个等比序列。

推倒:

    1. S(g(i))
    1. = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk)
    1. // 设 A = {1,1,0,1}, (花括号表示矩阵...)
    1. // 也就是fib数的变化矩阵,F(x) = (A^x) * {1,0}
    1. = F(b) + (A^k)F(b) + (A^2k)F(b)+….+(A^nk)F(b)
    1. // 提取公因式 F(b)
    1. = F(b) [ E +A^k + A^2k + ….+ A^nk] // (E表示的是单位矩阵)
    1. // 令 K = A^k 后
    1. E +A^k + A^2k + ….+ A^nk 变成 K^0+K^1+K^2+…+K^n

然后等比数列是能够二分求和的:数论_等比数列二分求和

代码:

  1. /*
  2. * Author: illuz <iilluzen[at]gmail.com>
  3. * Blog: http://blog.csdn.net/hcbbt
  4. * File: 1588.cpp
  5. * Create Date: 2014-08-04 16:13:51
  6. * Descripton: Matrix
  7. */
  8.  
  9. #include <cstdio>
  10. #include <cstring>
  11. #include <iostream>
  12. #include <map>
  13. #include <algorithm>
  14. using namespace std;
  15. #define repf(i,a,b) for(int i=(a);i<=(b);i++)
  16. typedef long long ll;
  17.  
  18. const int N = 20;
  19. const int SIZE = 2; // max size of the matrix
  20.  
  21. ll MOD;
  22. ll k, b, n;
  23.  
  24. struct Mat{
  25. int n;
  26. ll v[SIZE][SIZE]; // value of matrix
  27.  
  28. Mat(int _n = SIZE) {
  29. n = _n;
  30. }
  31.  
  32. void init(ll _v = 0) {
  33. memset(v, 0, sizeof(v));
  34. if (_v)
  35. repf (i, 0, n - 1)
  36. v[i][i] = _v;
  37. }
  38.  
  39. void output() {
  40. repf (i, 0, n - 1) {
  41. repf (j, 0, n - 1)
  42. printf("%lld ", v[i][j]);
  43. puts("");
  44. }
  45. puts("");
  46. }
  47. } a, B, C;
  48.  
  49. Mat operator * (Mat a, Mat b) {
  50. Mat c(a.n);
  51. repf (i, 0, a.n - 1) {
  52. repf (j, 0, a.n - 1) {
  53. c.v[i][j] = 0;
  54. repf (k, 0, a.n - 1) {
  55. c.v[i][j] += (a.v[i][k] * b.v[k][j]) % MOD;
  56. c.v[i][j] %= MOD;
  57. }
  58. }
  59. }
  60. return c;
  61. }
  62.  
  63. Mat operator ^ (Mat a, ll k) {
  64. Mat c(a.n);
  65. c.init(1);
  66. while (k) {
  67. if (k&1) c = a * c;
  68. a = a * a;
  69. k >>= 1;
  70. }
  71. return c;
  72. }
  73.  
  74. Mat operator + (Mat a, Mat b) {
  75. Mat c(a.n);
  76. repf (i, 0, a.n - 1)
  77. repf (j, 0, a.n - 1)
  78. c.v[i][j] = (b.v[i][j] + a.v[i][j]) % MOD;
  79. return c;
  80. }
  81.  
  82. Mat operator + (Mat a, ll b) {
  83. Mat c = a;
  84. repf (i, 0, a.n - 1)
  85. c.v[i][i] = (a.v[i][i] + b) % MOD;
  86. return c;
  87. }
  88.  
  89. // 二分求和1..n
  90. Mat calc(Mat a, int n) {
  91. if (n == 1)
  92. return a;
  93. if (n&1)
  94. return (a^n) + calc(a, n - 1);
  95. else
  96. return calc(a, n/2) * ((a^(n/2)) + 1);
  97. }
  98.  
  99. int main() {
  100. a.init();
  101. a.v[0][0] = a.v[0][1] = a.v[1][0] = 1;
  102. while (~scanf("%lld%lld%lld%lld", &k, &b, &n, &MOD)) {
  103. B = (a^k);
  104. C = calc(B, n - 1) + (a^0);
  105. C = (a^b) * C;
  106. printf("%lld\n", C.v[0][1]);
  107. }
  108. return 0;
  109. }

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)的更多相关文章

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

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

  2. HDU 1588 Gauss Fibonacci(矩阵快速幂)

    Gauss Fibonacci Time Limit: 3000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

  3. HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)

    题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum.并对m取模. 思路:  设A = |(1, 1),(1, 0) ...

  4. HDU 1575 Tr A(矩阵高速幂)

    题目地址:HDU 1575 矩阵高速幂裸题. 初学矩阵高速幂.曾经学过高速幂.今天一看矩阵高速幂,原来其原理是一样的,这就好办多了.都是利用二分的思想不断的乘.仅仅只是把数字变成了矩阵而已. 代码例如 ...

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

    Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very cle ...

  6. hdu 1588(Fibonacci矩阵求和)

    题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a, ...

  7. hdu 1588 Gauss Fibonacci(矩阵嵌矩阵)

    题目大意: 求出斐波那契中的 第 k*i+b 项的和. 思路分析: 定义斐波那契数列的矩阵 f(n)为斐波那契第n项 F(n) = f(n+1) f(n) 那么能够知道矩阵 A = 1 1 1  0 ...

  8. HDU 2604 Queuing(矩阵高速幂)

    题目地址:HDU 2604 这题仅仅要推出公式来,构造矩阵就非常easy了.问题是推不出公式来..TAT.. 从递推的思路考虑.用f(n)表示n个人满足条件的结果.假设最后一个是m则前n-1人能够随意 ...

  9. HDU 2604 Queuing,矩阵高速幂

    题目地址:HDU 2604 Queuing 题意:  略 分析: 易推出:   f(n)=f(n-1)+f(n-3)+f(n-4) 构造一个矩阵: 然后直接上板子: /* f[i] = f[i-1] ...

随机推荐

  1. mount nfs 各版本之间的转换

    [root@one1-fst-hx ~]# mount.nfs 182.168.2.49:/mnt/sdb/nfs /mnt/nfs2/ nomand,-o vers=3[root@one1-fst- ...

  2. vue 数据没有驱动视图?

    Part.1  问题 数据改变,视图却没有根据数据而改变. 原因在于,数据并不在 vue 监听范围之内,vue 只对事先在 data 中声明的变量丶对象等类型数据进行监听 Part.2  例子 < ...

  3. Shell替换数组元素之间的间隔符号

    Shell中的数组是这样表示的: arr=(1,2,3,4,5) 它们数组元素的间隔符号为逗号,如果我相把逗号替换为加号: echo ${arr//,/+} 输出: 1+2+3+4+5 这个表达式是我 ...

  4. docker 私有镜像服务器搭建

    1.准备一台服务器A(已安装docker, IP:192.168.39.111) 2.在服务器A上通过运行registry容器进行搭建 docker run -itd -v /my_registry: ...

  5. php中session和cookie的使用及区别

    1.cookie的使用 什么是 Cookie? cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 P ...

  6. uwsgs loading shared libraries: libicui18n.so.58 异常处理

    背景 想使用 ningx + uwsgi + flask 搭建 python 应用环境 Python使用的是anaconda3(pyhton 3.6) 依赖包安装完毕,但是执行 uwsgi 的时候出现 ...

  7. 数据结构实验7:实现二分查找、二叉排序(查找)树和AVL树

    实验7 学号:      姓名:     专业: 7.1实验目的 (1) 掌握顺序表的查找方法,尤其是二分查找方法. (2) 掌握二叉排序树的建立及查找. 查找是软件设计中的最常用的运算,查找所涉及到 ...

  8. [数据结构]C#基于数组实现泛型顺序表

    前方预警,只完成了顺序表的插入/删除/查找. 错误代码示例: /// <summary> /// 查找顺序表第i个位置的元素 /// 在显示情况中,我们更常用下标 /// </sum ...

  9. 【shell】通过shell编写ping包及arp的监控并发送短信

    1 #!/bin/bash 2 NOW="`date +%Y%m%d-%H:%M:%S`" 3 PHONES=15134567893 4 IP=10.100.8.78 5 GATE ...

  10. 【Educational Codeforces Round 48】

    A:https://www.cnblogs.com/myx12345/p/9843001.html B:https://www.cnblogs.com/myx12345/p/9843021.html ...