hdu_4686

题目大意:给出an,bn的递推,求ai*bi(i=0,1,……n-1)的和(an=a(n-1)*Ax+Ay, bn=b(n-1)*Bx+Bya0=A0, b0=B0, Ax,Bx,Ay,By已知)。

题解:矩阵快速幂不用说了,式子也好推,开了ll基本没有坑点,奇葩的是这题是做连通分量做到的,有丶意思。


  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <cmath>
  5. #include <algorithm>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N = 6;
  9. const int MOD = 1e9 + 7;
  10. ll A0, B0, Ax, Bx, Ay, By;
  11. ll p, q, r, s;
  12. struct M
  13. {
  14. ll mat[N];
  15. M(){}
  16. M( int _ )
  17. {
  18. mat[1] = A0*B0%MOD;
  19. mat[2] = A0; mat[3] = B0;
  20. mat[4] = 1;
  21. mat[5] = A0*B0%MOD;
  22. }
  23. };
  24. struct _M
  25. {
  26. ll mat[N][N];
  27. _M(){}
  28. _M( int _ )
  29. {
  30. mat[1][1] = p; mat[1][2] = q; mat[1][3] = r; mat[1][4] = s; mat[1][5] = 0;
  31. mat[2][1] = mat[2][3] = mat[2][5] = 0; mat[2][2] = Ax%MOD; mat[2][4] = Ay%MOD;
  32. mat[3][1] = mat[3][2] = mat[3][5] = 0; mat[3][3] = Bx%MOD; mat[3][4] = By%MOD;
  33. mat[4][1] = mat[4][2] = mat[4][3] = mat[4][5] = 0; mat[4][4] = 1;
  34. mat[5][1] = p; mat[5][2] = q; mat[5][3] = r; mat[5][4] = s; mat[5][5] = 1;
  35. }
  36. };
  37. void init()
  38. {
  39. p = Ax*Bx%MOD;
  40. q = Ax*By%MOD;
  41. r = Bx*Ay%MOD;
  42. s = Ay*By%MOD;
  43. }
  44. M M12( M a, _M b )
  45. {
  46. M c;
  47. memset(c.mat,0,sizeof(c.mat));
  48. for ( int i = 1; i < N; i ++ )
  49. {
  50. ll cur = 0;
  51. for ( int j = 1; j < N; j ++ )
  52. cur += (a.mat[j]%MOD*b.mat[i][j]%MOD)%MOD;
  53. c.mat[i] = cur % MOD;
  54. }
  55. return c;
  56. }
  57. _M M22( _M a, _M b )
  58. {
  59. _M c;
  60. memset(c.mat,0,sizeof(c.mat));
  61. for ( int i = 1; i < N; i ++ )
  62. {
  63. for ( int j = 1; j < N; j ++ )
  64. {
  65. ll cur = 0;
  66. for ( int k = 1; k < N; k ++ )
  67. cur += (a.mat[i][k]%MOD*b.mat[k][j]%MOD)%MOD;
  68. c.mat[i][j] = cur % MOD;
  69. }
  70. }
  71. return c;
  72. }
  73. M qp( M a, _M b, ll c )
  74. {
  75. while ( c )
  76. {
  77. if ( c & 1 ) a = M12( a, b );
  78. c >>= 1;
  79. b = M22(b,b);
  80. }
  81. return a;
  82. }
  83. int main()
  84. {
  85. ll m;
  86. while ( ~scanf("%lld", &m) )
  87. {
  88. scanf("%lld%lld%lld", &A0, &Ax, &Ay);
  89. scanf("%lld%lld%lld", &B0, &Bx, &By);
  90. if ( !m ) puts("0");
  91. else if ( m == 1 )
  92. {
  93. ll now = A0%MOD*B0%MOD%MOD;
  94. printf("%lld\n", now);
  95. }
  96. else
  97. {
  98. init();
  99. M ans(1);
  100. _M base(1);
  101. /* for ( int i = 1; i < N; i ++)
  102. cout << ans.mat[i] << endl;
  103. for ( int i = 1; i < N; i ++ )
  104. {
  105. for ( int j = 1; j < N; j ++ )
  106. cout << base.mat[i][j] << " ";
  107. cout << endl;
  108. }
  109. */
  110. ans = qp( ans, base, m-1);
  111. printf("%lld\n", (ans.mat[5]%MOD+MOD)%MOD);
  112. }
  113. }
  114. return 0;
  115. }

Matrix_QP(A_2SeqSum)的更多相关文章

随机推荐

  1. application/x-protobuf payload加密 知乎

  2. vue下登录页背景图上下空白处自适应等高

    遇到需求,登录页面需要顶部和底部上下等高,并且随着浏览器自适应上下高度. 解决方法: vue界面的data中先定义 data() { return { windowHeight: "&quo ...

  3. 神、上帝以及老天爷--hdu2048(错排,递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2048 1. N张字条的所有可能排列自然是N!(分母). 现在的问题就是求N张字条的错排数f(N)(分子 ...

  4. 14.Iterate a Cursor in the mongo Shell-官方文档摘录

    1 迭代游标 } ); while (myCursor.hasNext()) { print(tojson(myCursor.next())); } } ); myCursor.forEach(pri ...

  5. PostgreSQL学习手册-模式Schema(转)

    原文:http://www.cnblogs.com/stephen-liu74/archive/2012/04/25/2291526.html 一个数据库包含一个或多个命名的模式,模式又包含表.模式还 ...

  6. 009-mac下记事本工具 sublime text3

    1.subline text3 下载:https://download.sublimetext.com/Sublime%20Text%20Build%203143.dmg 序列号:[来源与互联网,如有 ...

  7. Shiro起步

    1.测试环境  IntelliJ Idea 2.pom配置 <?xml version="1.0" encoding="UTF-8"?> <p ...

  8. DB_FILE_MULTIBLOCK_READ_COUNT对物理读和IO次数的影响

    当执行SELECT语句时,如果在内存里找不到相应的数据,就会从磁盘读取进而缓存至LRU末端(冷端),这个过程就叫物理读.当相应数据已在内存,就会逻辑读. 物理读是磁盘读,逻辑读是内存读:内存读的速度远 ...

  9. mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数

    mysql:视图.触发器.事务.存储过程.函数 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果 ...

  10. HDU 4585 Shaolin(map应用+二分)

    题目大意:原题链接 初始少林最开始只有一个老和尚,很多人想进少林,每个人有一个武力值,若某个人想进少林,必须先与比他早进去的并且武力值最接近他的和尚比武, 如果接近程度相同则选择武力值比他小的,按照进 ...