矩阵行列式
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef __int64 lld;
lld a[205][205];
int sign;
lld N,MOD;
void solved()
{
lld ans=1;
for(int i=0;i<N;i++)
{
for(int j=i+1;j<N;j++)
{
int x=i,y=j;
while(a[y][i])
{
lld t=a[x][i]/a[y][i];
for(int k=i;k<N;k++)
a[x][k]=(a[x][k]-a[y][k]*t)%MOD;
swap(x,y);
}
if(x!=i)
{
for(int k=0;k<N;k++)
swap(a[i][k],a[x][k]);
sign^=1;
}
}
if(a[i][i]==0)
{
cout<<0<<endl;
return ;
}
else
ans=ans*a[i][i]%MOD;
}
if(sign!=0)
ans*=-1;
if(ans<0)
ans+=MOD;
printf("%I64d\n",ans);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
sign=0;
scanf("%I64d%I64d",&N,&MOD);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
scanf("%I64d",&a[i][j]);
solved();
}
return 0;
}
高精度模板
__int128
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 81 ;
void input(__int128 &s)
{
s = 0 ;
char c= ' ' ;
while(c > '9' || c < '0') c = getchar() ;
while(c >= '0' && c <= '9')
s = s * 10 + c - '0' , c = getchar() ;
}
void output(__int128 x)
{
if(x > 9)
output(x / 10) ;
putchar(x % 10 + '0') ;
}
int n , m ;
__int128 f[MAXN][MAXN] ;
__int128 game[MAXN][MAXN] ;
__int128 solve(__int128 a[])
{
memset(f , 0 , sizeof f) ;
for(int len = 0 ;len <= m ;len ++)
for(int i = 1 ;i + len <= m ;i ++)
f[i][i + len] = max(2 * f[i + 1][i + len] + 2 * a[i] , 2 * f[i][i + len - 1] + 2 * a[i + len]) ;
return f[1][m] ;
}
__int128 ans = 0 ;
int main()
{
cin >> n >> m ;
for(int i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= m ;j ++)
input(game[i][j]) ;
for(int i = 1 ;i <= n ;i ++)
ans += solve(game[i]) ;
output(ans) ;
return 0 ;
}
高精度相乘
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int MAXN = 85, Mod = 10000;
int n, m;
int ar[MAXN];
struct HP {
int p[505], len;
HP() {
memset(p, 0, sizeof p);
len = 0;
}
void print() {
printf("%d", p[len]);
for (int i = len - 1; i > 0; i--) {
if (p[i] == 0) {
printf("0000");
continue;
}
for (int k = 10; k * p[i] < Mod; k *= 10)
printf("0");
printf("%d", p[i]);
}
}
} f[MAXN][MAXN], base[MAXN], ans;
HP operator + (const HP &a, const HP &b) {
HP c; c.len = max(a.len, b.len); int x = 0;
for (int i = 1; i <= c.len; i++) {
c.p[i] = a.p[i] + b.p[i] + x;
x = c.p[i] / Mod;
c.p[i] %= Mod;
}
if (x > 0)
c.p[++c.len] = x;
return c;
}
HP operator * (const HP &a, const int &b) {
HP c; c.len = a.len; int x = 0;
for (int i = 1; i <= c.len; i++) {
c.p[i] = a.p[i] * b + x;
x = c.p[i] / Mod;
c.p[i] %= Mod;
}
while (x > 0)
c.p[++c.len] = x % Mod, x /= Mod;
return c;
}
HP max(const HP &a, const HP &b) {
if (a.len > b.len)
return a;
else if (a.len < b.len)
return b;
for (int i = a.len; i > 0; i--)
if (a.p[i] > b.p[i])
return a;
else if (a.p[i] < b.p[i])
return b;
return a;
}
void BaseTwo() {
base[0].p[1] = 1, base[0].len = 1;
for (int i = 1; i <= m + 2; i++){
base[i] = base[i - 1] * 2;
}
}
int main(void) {
scanf("%d%d", &n, &m);
BaseTwo();
while (n--) {
memset(f, 0, sizeof f);
for (int i = 1; i <= m; i++)
scanf("%d", &ar[i]);
for (int i = 1; i <= m; i++)
for (int j = m; j >= i; j--) {
f[i][j] = max(f[i][j], f[i - 1][j] + base[m - j + i - 1] * ar[i - 1]);
f[i][j] = max(f[i][j], f[i][j + 1] + base[m - j + i - 1] * ar[j + 1]);
}
HP Max;
for (int i = 1; i <= m; i++)
Max = max(Max, f[i][i] + base[m] * ar[i]);
ans = ans + Max;
}
ans.print();
return 0;
}