【题目链接】

点击打开链接

【算法】

要求

f(g(0)) + f(g(1)) + f(g(2)) + ... + f(g(n-1))

因为g(i) = k * i + b

所以原式 = f(b) + f(k+b) + f(2k+b) + .... + f((n-1)k+b)

令矩阵A = {1,1,0,1}(求斐波那契数的矩阵)

那么,式子就可以写成A^b + A^(k + b) + A ^ (2k + b) + .... + A ^ ((n - 1)k + b)

因为矩阵符合乘法分配律,所以可以将A^b提出,式子被写成 :

A ^ b( E + A ^ k + A ^ 2k + ... + A ^ (n - 1)k ) (其中E为2阶单位阵)

令矩阵S = A ^ k

那么式子就被进一步化简为 : A^b( S^0 + S^1 + S^2 + .. + S^(n-1) )

A^b可以通过矩阵乘法快速幂求出

而后面的S^0 + S^1 + S ^ 2 + ... S^(n-1)则可以通过二分求解(也就是POJ 3233的方法)

【代码】

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n,b,k,m;
  5. struct Matrix
  6. {
  7. long long mat[][];
  8. } A,E,ans,s;
  9.  
  10. inline Matrix mul(Matrix a,Matrix b)
  11. {
  12. int i,j,k;
  13. Matrix ans;
  14. memset(ans.mat,,sizeof(ans.mat));
  15. for (i = ; i <= ; i++)
  16. {
  17. for (j = ; j <= ; j++)
  18. {
  19. for (k = ; k <= ; k++)
  20. {
  21. ans.mat[i][j] = (ans.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % m;
  22. }
  23. }
  24. }
  25. return ans;
  26. }
  27. inline Matrix add(Matrix a,Matrix b)
  28. {
  29. int i,j;
  30. Matrix ans;
  31. memset(ans.mat,,sizeof(ans.mat));
  32. for (i = ; i <= ; i++)
  33. {
  34. for (j = ; j <= ; j++)
  35. {
  36. ans.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % m;
  37. }
  38. }
  39. return ans;
  40. }
  41. inline Matrix power(Matrix a,int n)
  42. {
  43. int i,j;
  44. Matrix ans,p = a;
  45. for (i = ; i <= ; i++)
  46. {
  47. for (j = ; j <= ; j++)
  48. {
  49. ans.mat[i][j] = (i == j);
  50. }
  51. }
  52. while (n > )
  53. {
  54. if (n & ) ans = mul(ans,p);
  55. p = mul(p,p);
  56. n >>= ;
  57. }
  58. return ans;
  59. }
  60. inline Matrix solve(Matrix a,int n)
  61. {
  62. Matrix tmp;
  63. if (n == ) return a;
  64. if (n % == ) return add(solve(a,n-),power(a,n));
  65. else
  66. {
  67. tmp = solve(a,n/);
  68. return add(tmp,mul(power(a,n/),tmp));
  69. }
  70. }
  71.  
  72. int main() {
  73.  
  74. E.mat[][] = ; E.mat[][] = ;
  75. E.mat[][] = E.mat[][] = ;
  76. while (scanf("%d%d%d%d",&k,&b,&n,&m) != EOF)
  77. {
  78. A.mat[][] = A.mat[][] = A.mat[][] = ;
  79. A.mat[][] = ;
  80. s = power(A,k);
  81. ans = mul(power(A,b),add(E,solve(s,n-)));
  82. printf("%lld\n",ans.mat[][]);
  83. }
  84.  
  85. return ;
  86.  
  87. }

【HDU 1588】 Gauss Fibonacci的更多相关文章

  1. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  2. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  3. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  4. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  5. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  6. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  7. 【hdu 1848】Fibonacci again and again

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  8. 【hdu 1043】Eight

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...

  9. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

随机推荐

  1. Mysql学习总结(43)——MySQL主从复制详细配置

    环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6.26.tar.gz 主节点IP:192.168.1.205 主机名:edu-mysql ...

  2. python接口测试之Http请求(三)

    python的强大之处在于提供了很多的标准库,这些标准库可以直接调用,本节部分,重点学习和总结在 接口测试中Python的Http请求的库的学习. 首先来看httplib,官方的解释为:本模块定义了类 ...

  3. 数据库 SQL SQL转义

    SQL转义 @author ixenos 前言 类似文件分隔符在不同系统的实现不同,我们需要一个中间的转义字符来作为接口,各厂商再具体实现 而SQL的转义语法主要为了支持各种数据库普遍支持的特性,但各 ...

  4. [luoguP3402] 最长公共子序列(DP + 离散化 + 树状数组)

    传送门 比 P1439 排列LCS问题,难那么一点点,只不过有的元素不是两个串都有,还有数据范围变大,树状数组得打离散化. 不过如果用栈+二分的话还是一样的. ——代码 #include <cs ...

  5. HDU 4960 (水dp)

    Another OCD Patient Problem Description Xiaoji is an OCD (obsessive-compulsive disorder) patient. Th ...

  6. JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明

    JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...

  7. 【ZJOI2017 Round1练习】D4T2 trie(贪心,状压DP)

    题意:现在 Matej 手上有 N 个英文小写字母组成的单词, 他想知道,如果将这 N 个单词中的字母分别进行重新排列,形成的字母树的节点数最少是多少. n<=16,len[i]<=100 ...

  8. 51nod 1298 圆与三角形 (计算几何)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298 求出圆心到三条线段的最短距离,然后判断是否有顶点在圆外,就把全部情 ...

  9. codevs——6221 数的统计

    6221 数的统计  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 有一个人名字叫A,B总喜欢打他. 这 ...

  10. MySQL主主复制搭建教程收集(待实践)

    先收集,后续再实践. http://www.cnblogs.com/ahaii/p/6307648.html http://blog.csdn.net/jenminzhang/article/deta ...