HDU6470 Count

向右看齐 2021-09-18 12:36 363阅读 0赞

好久没写矩阵快速幂(其实这题可以直接用杜教的BM板子,比赛时突然想练一下矩阵快速幂)
比较难搞的是 n 3 n^3 n3
考虑 n 3 − > ( n + 1 ) 3 n^3 -> (n+1)^3 n3−>(n+1)3,多了 3 n 2 , 3 n , 1 3n^2,3n,1 3n2,3n,1
然后就可以构造一个6x6的矩阵 [ f ( n − 1 ) , f ( n − 2 ) , n 3 , 3 n 2 , 3 n , 1 ] [f(n-1),f(n-2),n^3,3n^2,3n,1] [f(n−1),f(n−2),n3,3n2,3n,1]
在这里插入图片描述

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define rep(i,a,n) for (int i=a;i<n;i++)
  4. #define per(i,a,n) for (int i=n-1;i>=a;i--)
  5. #define pb push_back
  6. #define mp make_pair
  7. #define all(x) (x).begin(),(x).end()
  8. #define fi first
  9. #define se second
  10. #define SZ(x) ((int)(x).size())
  11. typedef vector<int> VI;
  12. typedef long long ll;
  13. typedef pair<int,int> PII;
  14. const ll mod=123456789;
  15. ll powmod(ll a,ll b) { ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){ if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
  16. ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
  17. const int maxn = 6;
  18. int T;
  19. ll n;
  20. struct Matrix{
  21. ll a[maxn][maxn];
  22. void init(){
  23. memset(a, 0, sizeof(a));
  24. for(int i=0;i<maxn;++i){
  25. a[i][i] = 1;
  26. }
  27. }
  28. void Init(){
  29. memset(a, 0, sizeof(a));
  30. }
  31. };
  32. Matrix mul(Matrix a, Matrix b){
  33. Matrix ans;
  34. for(int i=0;i<maxn;++i){
  35. for(int j=0;j<maxn;++j){
  36. ans.a[i][j] = 0;
  37. for(int k=0;k<maxn;++k){
  38. ans.a[i][j] += a.a[i][k] * b.a[k][j];
  39. ans.a[i][j] %= mod;
  40. }
  41. }
  42. }
  43. return ans;
  44. }
  45. Matrix qpow(Matrix a, ll n){
  46. Matrix ans;
  47. ans.init();
  48. while(n){
  49. if(n&1) ans = mul(ans, a);
  50. a = mul(a, a);
  51. n /= 2;
  52. }
  53. return ans;
  54. }
  55. void output(Matrix a){
  56. for(int i=0;i<maxn;++i){
  57. for(int j=0;j<maxn;++j){
  58. cout << a.a[i][j] << " ";
  59. }
  60. cout << endl;
  61. }
  62. }
  63. int main(int argc, char const *argv[])
  64. {
  65. ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  66. Matrix tmp;
  67. tmp.Init();
  68. tmp.a[0][0] = 1;
  69. tmp.a[0][1] = 1;
  70. tmp.a[1][0] = 2;
  71. tmp.a[2][0] = 1;
  72. tmp.a[2][2] = 1;
  73. tmp.a[3][2] = 1;
  74. tmp.a[3][3] = 1;
  75. tmp.a[4][2] = 1;
  76. tmp.a[4][3] = 2;
  77. tmp.a[4][4] = 1;
  78. tmp.a[5][2] = 1;
  79. tmp.a[5][3] = 3;
  80. tmp.a[5][4] = 3;
  81. tmp.a[5][5] = 1;
  82. cin >> T;
  83. while(T--)
  84. {
  85. cin >> n;
  86. Matrix t = qpow(tmp,n-2);
  87. //output(t);
  88. Matrix ans;
  89. ans.Init();
  90. ans.a[0][0] = 2;
  91. ans.a[0][1] = 1;
  92. ans.a[0][2] = 3*3*3;
  93. ans.a[0][3] = 3*3*3;
  94. ans.a[0][4] = 3*3;
  95. ans.a[0][5] = 1;
  96. Matrix as = mul(ans,t);
  97. cout << as.a[0][0] << endl;
  98. }
  99. return 0;
  100. }

发表评论

表情:
评论列表 (有 0 条评论,363人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU6470 Count

    好久没写矩阵快速幂(其实这题可以直接用杜教的BM板子,比赛时突然想练一下矩阵快速幂) 比较难搞的是 n 3 n^3 n3 考虑 n 3 − > ( n + 1 ) 3