[关闭]
@994495jj 2017-05-31T11:48:02.000000Z 字数 1896 阅读 919

HDU 5950 Recursive sequence(矩阵快速幂)

(ACM)数学----矩阵快速幂



题意

题解

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. typedef long long ll;
  4. const ll mod=2147493647;
  5. struct Mat {
  6. ll mat[8][8];
  7. Mat() {memset(mat,0,sizeof(mat));}
  8. Mat operator * (Mat B) {
  9. Mat C;
  10. for(int i=1;i<=7;++i) {
  11. for(int j=1;j<=7;++j) {
  12. for(int k=1;k<=7;++k) {
  13. C.mat[i][j]=(C.mat[i][j]+mat[i][k]*B.mat[k][j]%mod)%mod;
  14. }
  15. }
  16. }
  17. return C;
  18. }
  19. };
  20. Mat powmul(Mat A,ll k) {
  21. Mat B;
  22. for(int i=1;i<=7;++i) B.mat[i][i]=1;
  23. while(k) {
  24. if(k&1) B=B*A;
  25. A=A*A;
  26. k>>=1;
  27. }
  28. return B;
  29. }
  30. ll solve(ll n,ll a,ll b) {
  31. if(n==1) return a;
  32. if(n==2) return b;
  33. Mat A;
  34. A.mat[1][1]=A.mat[1][3]=A.mat[1][7]=1;A.mat[1][2]=2;A.mat[1][4]=A.mat[1][6]=4;A.mat[1][5]=6;
  35. A.mat[2][1]=1;
  36. A.mat[3][3]=A.mat[3][7]=1;A.mat[3][4]=A.mat[3][6]=4;A.mat[3][5]=6;
  37. A.mat[4][4]=A.mat[4][7]=1;A.mat[4][5]=A.mat[4][6]=3;
  38. A.mat[5][5]=A.mat[5][7]=1;A.mat[5][6]=2;
  39. A.mat[6][6]=A.mat[6][7]=1;
  40. A.mat[7][7]=1;
  41. A=powmul(A,n-2);
  42. ll ans=A.mat[1][1]*b%mod;
  43. ans=(ans+A.mat[1][2]*a%mod)%mod;
  44. ans=(ans+A.mat[1][3]*16%mod)%mod;
  45. ans=(ans+A.mat[1][4]*8%mod)%mod;
  46. ans=(ans+A.mat[1][5]*4%mod)%mod;
  47. ans=(ans+A.mat[1][6]*2%mod)%mod;
  48. ans=(ans+A.mat[1][7])%mod;
  49. return ans;
  50. }
  51. int main() {
  52. int T;scanf("%d",&T);
  53. while(T--) {
  54. ///
  55. ll n,a,b;scanf("%I64d%I64d%I64d",&n,&a,&b);
  56. ///solve
  57. printf("%I64d\n",solve(n,a,b));
  58. }
  59. return 0;
  60. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注