Title: http://www.lydsy.com/JudgeOnline/problem.php?id=4031
Matrix tree theorem. The Kirchhoff matrix is for I=j,a[i][j]=d[i], and for i!=j,a[i][j]=a[j][i]=-1 (if it can be connected), it is 0.
Then take this matrix out of line I, the determinant (it is convenient to delete the nth row). )
Modulus comparison pit dad, not a prime number, so divide.
#include <string>#include<iostream>#include<algorithm>#include<cstdio>#defineRep (i,l,r) for (int i=l;i<=r;i++)#defineDown (i,l,r) for (int i=l;i>=r;i--)#defineCLR (x, y) memset (x,y,sizeof (×))#definell Long Long#defineMAXN 109#defineMM 1000000000using namespacestd;intN,m,p[maxn][maxn],idx;CharS[MAXN][MAXN];intdx[4]={0,1,0,-1},dy[4]={1,0,-1,0};ll ANS,A[MAXN][MAXN];intRead () {intx=0, f=1;CharCh=GetChar (); while(!isdigit (CH)) {if(ch=='-') f=-1; Ch=GetChar ();} while(IsDigit (CH)) {x=x*Ten+ch-'0'; Ch=GetChar ();} returnx*F;}BOOLJudintXinty) { if(x<1|| x>n| | y<1|| y>m| | s[x][y]!='.')return 0; return 1;} ll Det (intN) {Rep (i,1, N) Rep (J,1, N) a[i][j]= (a[i][j]+mm)%mm; ll F=1; Rep (I,1, N) {Rep (j,i+1, N) { if(a[j][i]==0)Continue; ll A=a[i][i],b=A[j][i]; while(B) {ll T=a/b; a%=Swap (A, b); Rep (k,i,n) a[i][k]= (a[i][k]-a[j][k]*t%mm+mm)%mm; Rep (k,i,n) swap (a[i][k],a[j][k]); F=-F; } } if(a[i][i]==0)return 0; Ans=ans*a[i][i]%mm; } if(f==-1) ans= ((Mm-ans)%mm+mm)%mm; returnans;}intMain () {n=read (); m=read (); Rep (I,1, N) scanf ("%s", s[i]+1); Rep (I,1, N) Rep (J,1, m)if(s[i][j]=='.') p[i][j]=++idx; Rep (I,1, N) Rep (J,1, m)if(s[i][j]=='.') {rep (k,0,3) { intx=i+dx[k],y=j+Dy[k]; if(Jud (x, y)) {intu=p[i][j],v=P[x][y]; A[u][u]++; a[u][v]--; }}} ans=1; printf ("%lld\n", Det (idx-1)); return 0;}
Bzoj 4031: [HEOI2015] Little Z's room