矩阵快速幂模板

来源:互联网 发布:淘宝图 编辑:程序博客网 时间:2024/06/03 23:01
#include <stdio.h>#include <string.h>#include <iostream>struct matrix_task{  typedef long long llong;  typedef llong matrix[4][4];#define rep(i) for (int i = 0; i < n; ++i)  int mod;  int n;  void reset(matrix m, int flag)  {    memset(m, 0, sizeof(matrix));    rep(i) m[i][i] = flag;  }  void multiply(matrix a, matrix b, matrix c)  {    reset(c, 0);    rep(i) rep(j) if (a[i][j]) rep(k) {      c[i][k] = (c[i][k] + a[i][j] * b[j][k]) % mod;    }  }  void multiply(matrix a, matrix b)  {    static matrix tmp;    multiply(a, b, tmp);    memcpy(a, tmp, sizeof(matrix));  }  void power(matrix m, llong p, matrix c)  {    reset(c, 1);    for (; p; p >>= 1) {      if (p & 1) {        multiply(c, m);      }      multiply(m, m);    }  }  void power(matrix m, llong p)  {    static matrix tmp;    power(m, p, tmp);    memcpy(m, tmp, sizeof(matrix));  }  matrix_task(int mod, int n)  {    this -> mod = mod;    this -> n = n;  }#undef rep};#define MOD 1e9 + 7int main(){  matrix_task::llong n;  std::cin >> n;  matrix_task mt(MOD, 2);  matrix_task::matrix o;  o[0][0] = 1; o[0][1] = 1;  o[1][0] = 1; o[1][1] = 0;  mt.power(o, n);  std::cout << o[1][0] << std::endl;  return 0;  //write by zhangjingzhi}
0 0
原创粉丝点击