您的位置:首页 > 其它

【模板篇】01 矩阵运算 方阵快速幂

2017-02-09 17:26 246 查看
今天做矩阵快速幂,突然就想把模板写成模板。

然后就吓得我写了个关于方阵的class,其实时间复杂度和码长都爆表了呢~

然后就准备把板子在这里贴出来,结果感觉DEV C++写出来的代码太不美观,于是又打开VS2015 修缮 了一下。。

然而VS2015自带修缮,粘贴上去的一瞬间就搞得能看了。简直对不起我打开VS2015等的时间

话说我第一次尝试大括号不换行,感觉美观程度还可以,但下次估计不会了,因为不习惯,尽管我是压行选手。。。。

反正大致就是这么回事,各位看官看代码就行了~

码风各种清奇,不喜勿喷。你们要想拿去用也不用经我同意,当然用了结果TLE不要来找我 就好。

毕竟luogu模板题3320+ms基本倒数。。。。(我什么都没说)

好了,下面上板子,还结合了跟方阵快速幂没关系的加和减和一些奇怪的操作,至于32位整数和64位你们看情况自己修改吧。。

//MARKDOWN也不过如此啊。。。不好看。。。
//初始开发环境: DEV C++ 5.11
//后期加工环境: Visual Studio 2015 Professional
#include <cstdio>
#include <iostream>
#define gc getchar
#define LL long long
void qin(LL &a)
{
a = 0; char c = gc(); bool f = 0;
for (; (c<'0' || c>'9') && c != '-'; c = gc());
if (c == '-') f = 1, c = gc();
for (; c >= '0'&&c <= '9'; c = gc()) a = (a << 1) + (a << 3) + c - '0';
if (f) a = -a;
}
class matrix
{
public:

void output() {                                         //快速输出
for (int i = 0; i<m; i++) {
for (int j = 0; j<n; j++)
putnum(data[i][j] % MOD),
putchar(' ');
puts("");
}
}

ma
b93b
trix(int x, int y, int mod) :m(x), n(y), MOD(mod) {           //构造函数
}

matrix() {                                              //+1重载
}

void matrix_init() {                                        //读入式矩阵初始化
for (int i = 0; i<m; i++)
for (int j = 0; j<n; j++)
data[i][j] = getnum();
}

void matrix_init(int **a) {                             //+1重载  赋值式矩阵初始化
for (int i = 0; i<m; i++)
for (int j = 0; j<n; j++)
data[i][j] = a[i][j];
}

matrix operator +(const matrix &b) {                        //重载+运算符 矩阵加法 没用*1
matrix c = matrix(m, n, MOD);
for (int i = 0; i<m; i++)
for (int j = 0; j<n; j++) {
c.data[i][j] = data[i][j] + b.data[i][j];
if (MOD) c.data[i][j] %= MOD;
}
return c;
}

void operator +=(const matrix &b) {                     //重载+=运算符 没啥卵用 没用*2
*this = *this + b;
}

matrix operator -(const matrix &b) {                        //重载-运算符 矩阵减法 没用*3
matrix c = matrix(m, n, MOD);
for (int i = 0; i<m; i++)
for (int j = 0; j<n; j++) {
c.data[i][j] = data[i][j] - b.data[i][j];
if (MOD) c.data[i][j] %= MOD;
}
return c;
}

void operator -=(const matrix &b) {                     //重载-=运算符 没啥卵用 没用*4
*this = *this - b;
}

matrix operator *(const matrix &b) {                        //重载*运算符 终于有用了。。。。
matrix c = matrix(m, n, MOD);
for (int i = 0; i<m; i++)
for (int j = 0; j<b.n; j++) {
LL ans = 0;
for (int k = 0; k<n; k++) {
ans += data[i][k] * b.data[k][j];
if (MOD) ans %= MOD;
}
c.data[i][j] = ans;
}
return c;
}

void operator *=(const matrix &b) {                     //重载*=运算符 除了偷懒没啥卵用 没用*5
*this = *this*b;
}

matrix operator ^(LL b) {                               //重载^运算符 这次不是异或是乘方( ⊙ o ⊙ )啊!
matrix ans = *this, t = *this; b--;
for (; b; b >>= 1, t *= t) {
if (b & 1) ans *= t;
}
return ans;
}

private:

static const int MAXN = 101;

int m, n, MOD;                                          //长 宽 模数
LL data[MAXN][MAXN];                                    //数据域

LL getnum() {                                           //快读
int a = 0; char c = gc(); bool f = 0;
for (; (c<'0' || c>'9') && c != '-'; c = gc());
if (c == '-') f = 1, c = gc();
for (; c >= '0'&&c <= '9'; c = gc()) a = (a << 1) + (a << 3) + c - '0';
if (f) a = -a;
return a;
}

void putnum(int num) {                                  //快速输出int
int c[12], cnt = 0;
for (; num; num /= 10)
c[++cnt] = num % 10;
for (; cnt; cnt--) putchar(c[cnt] + '0');
}

void putnum(LL num) {                                   //+1重载 快速输出long long
int c[24], cnt = 0;
for (; num; num /= 10)
c[++cnt] = num % 10;
for (; cnt; cnt--) putchar(c[cnt] + '0');
}
};

int main()
{
//main函数本来不想贴 贴来你们作参考算了~~
LL n, k; qin(n); qin(k);
matrix a = matrix(n, n, (int)1e9 + 7);
a.matrix_init();
matrix c = a^k; c.output();                             //so easy!
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: