来源:之前看 qyy 在洛谷的板子题上交了一个写的特别优美,特别短小精悍的行列式求值,某天需要做一个用矩阵树定理的题,就学习了一下,并自行进行了简单的卡常改进。
我暂且把它叫做亓爷爷行列式。
特别优美,改进后常数也较小,最重要的是短而好记啊!交模板题的时候算上输入输出也只有 600b
,算是用时和代码长度都较优的一个版本。
Mod
是模数,Array_Size
表示数组大小。
成品:
int Mod;
int det(int a[][Array_Size], int n) {
int res = 1;
for(int k = 1; k <= n && res; res = 1ll * res * a[k][k] % Mod, ++k)
for(int i = k + 1, c; i <= n; ++i) {
while(a[k][k]) {
c = a[i][k] / a[k][k];
for(int j = k; j <= n; ++j)
a[i][j] = (a[i][j] + 1ll * (Mod - c) * a[k][j]) % Mod;
std::swap(a[i], a[k]), res = Mod - res;
}
std::swap(a[i], a[k]), res = Mod - res;
}
return res;
}