文章目录
- Find The Determinant III
- source
- code
- Takahashi's Basics in Education and Learning
- source
- code
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
数学作业的老子版,解法几乎完全一样
只不过要考虑加ddd后位数变化多少位的小细节
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;
}