矩阵快快速幂模板

其实和整数的快速幂差不多:换成单位矩阵,矩阵乘法,矩阵加法,其他的都不变

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define mid ((l + r) >> 1) 
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define f first
#define s second
using namespace std;
const int N = 500 + 10;
const double eps = 1e-9;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
int n, mod, k;

struct matrix
{
    int date[35][35];
}odj;

matrix mul(matrix a, matrix b)
{
    matrix c;
    ms(c.date,0);
    _for(i,0,n)
      _for(j,0,n)
       _for(k,0,n)
        c.date[i][j] = (c.date[i][j] + 1ll * a.date[i][k] * b.date[k][j]) % mod;
        
        return c;
}

matrix add(matrix a, matrix b)
{
    matrix c;
    ms(c.date,0);
    _for(i,0,n)
     _for(j,0,n)
      c.date[i][j] = (a.date[i][j] + b.date[i][j]) % mod;
      
    return c; 
}

matrix qmi(matrix a, int k)
{
    matrix c;
    ms(c.date,0);
    _for(i,0,n)
     c.date[i][i] = 1;
    
    while(k)
    {
        if(k & 1) c = mul(c,a);
        k >>= 1;
        a = mul(a,a);
    }
    return c;
}

matrix sum(matrix a,int k)
{
    if(k == 1) return a;
    matrix c;
    ms(c.date,0);
    _for(i,0,n)
      c.date[i][i] = 1;
      
      c = add(c,qmi(a,k>>1));
      c = mul(c,sum(a,k>>1));
      
      if(k & 1) c = add(c,qmi(a,k));
      return c;
}

int main()
{
   IOS ;
   cin >> n >> k >> mod;
   _for(i,0,n)
    _for(j,0,n)
     cin >> odj.date[i][j];
     
   matrix ans;
  ans = sum(odj,k);
    // ans = mul(odj,odj);
   _for(i,0,n)
     _for(j,0,n)
       if(j == n - 1) cout << ans.date[i][j] << "\n";
       else cout << ans.date[i][j] << " ";
   return 0;
}

你可能感兴趣的:(高等代数)