您的位置:首页 > 其它

矩阵快速幂模板

2016-09-22 14:37 323 查看
#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 + 7
int 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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: