【模板记录】P10216 【模板】Pfaffian
由于 Pfaffian 值满足性质
从
接下来我们用第
对于最终的反对称矩阵
具体实现中,我们可以只维护矩阵主对角线上方的元素,但是需谨慎处理对称产生的正负号。
#include<bits/stdc++.h>
using namespace std;
const int maxn=505,mod=1000000007;
int n,ans,flg;
int a[maxn][maxn];
int ksm(int a,int b) {
int res=1;
while(b) {
if(b&1)
res=1ll*res*a%mod;
a=1ll*a*a%mod,b>>=1;
}
return res;
}
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++)
for(int j=i+1; j<=n; j++)
scanf("%d",&a[i][j]);
for(int i=1; i<=n; i+=2) {
int p=i+1;
for(int j=i+2; j<=n; j++)
if(a[i][j]) {
p=j;
break;
}
if(p!=i+1) {
flg^=1;
for(int j=1; j<=i; j++)
swap(a[j][i+1],a[j][p]);
for(int j=i+2; j<p; j++)
swap(a[i+1][j],a[j][p]),a[i+1][j]=mod-a[i+1][j],a[j][p]=mod-a[j][p];
a[i+1][p]=mod-a[i+1][p];
for(int j=p+1; j<=n; j++)
swap(a[i+1][j],a[p][j]);
}
int iv=ksm(a[i][i+1],mod-2);
for(int j=i+2; j<=n; j++)
if(a[i][j]) {
int coef=1ll*(mod-a[i][j])*iv%mod;
for(int k=1; k<=i; k++)
a[k][j]=(a[k][j]+1ll*coef*a[k][i+1])%mod;
for(int k=i+2; k<j; k++)
a[k][j]=(a[k][j]+1ll*(mod-coef)*a[i+1][k])%mod;
for(int k=j+1; k<=n; k++)
a[j][k]=(a[j][k]+1ll*coef*a[i+1][k])%mod;
}
}
ans=1;
for(int i=1; i<=n; i+=2)
ans=1ll*ans*a[i][i+1]%mod;
printf("%d\n",flg==0? ans%mod:(mod-ans)%mod);
return 0;
}