Find The Determinant III
source
高斯消元求行列式的模板题
code
#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 205
#define int long long
int n, mod;
int x[maxn][maxn];
signed main() {
while( ~ scanf( "%lld %lld", &n, &mod ) ) {
for( int i = 1;i <= n;i ++ )
for( int j = 1;j <= n;j ++ )
scanf( "%lld", &x[i][j] );
int ans = 1;
for( int i = 1;i <= n;i ++ ) {
for( int j = i + 1;j <= n;j ++ )
while( x[j][i] ) {//类似于辗转相除 这样就不会有非整数倍数取模情况了
int t = x[i][i] / x[j][i];
for( int k = i;k <= n;k ++ ) {
x[i][k] = ( x[i][k] - x[j][k] * t ) % mod;
swap( x[i][k], x[j][k] );
}
ans *= -1;
}
ans = ans * x[i][i] % mod;
}
printf( "%lld\n", ( ans + mod ) % mod );
}
return 0;
}
Takahashi’s Basics in Education and Learning
source
数学作业的老子版,解法几乎完全一样
只不过要考虑加 d d d后位数变化多少位的小细节
code
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define int long long
int n, a0, d, mod;
struct matrix {
int n, m;
int c[3][3];
matrix(){ n = m = 0, memset( c, 0, sizeof( c ) ); }
int * operator [] ( int i ) { return c[i]; }
matrix operator * ( matrix t ) const {
matrix ans;
ans.n = n, ans.m = t.m;
for( int i = 0;i < n;i ++ )
for( int j = 0;j < t.m;j ++ )
for( int k = 0;k < m;k ++ )
ans[i][j] = ( ans[i][j] + c[i][k] * t.c[k][j] ) % mod;
return ans;
}
}g, ret;
matrix qkpow( matrix x, int y ) {
matrix ans;
ans.n = ans.m = x.n;
for( int i = 0;i < 3;i ++ )
ans[i][i] = 1;
while( y ) {
if( y & 1 ) ans = ans * x;
x = x * x;
y >>= 1;
}
return ans;
}
signed main() {
scanf( "%lld %lld %lld %lld", &n, &a0, &d, &mod );
ret.n = 1, ret.m = g.n = g.m = 3;
ret[0][0] = a0 % mod;
ret[0][1] = ( a0 + d ) % mod;
ret[0][2] = g[1][0] = g[1][1] = g[2][2] = 1;
g[2][1] = d % mod;
n --;
int End = a0 + d * n;
for( int i = 0, mi = 10, last = 0;i < 18 && last < n;i ++, mi *= 10 )
if( a0 + d < mi ) {
int t = min( mi - 1, End );
int now = ( t - a0 ) / d;
while( a0 + d * ( now + 1 ) < t ) now ++;
g[0][0] = mi % mod;
ret = ret * qkpow( g, now - last );
last = now;
}
printf( "%lld\n", ret[0][0] );
return 0;
}