P4455 [CQOI2018]社交網路
阿新 • • 發佈:2018-12-07
沒想到連有向圖都有矩陣樹……本來還以為是大力容斥……
有向圖的矩陣樹改一下矩陣的構造,\(G[i][i]\)為點\(i\)的入度,\(G[i][j]\)表示\((i,j)\)之間的邊數的相反數,然後求出\((1,1)\)的代數餘子式就好了
今天才知道原來模意義下不一定要輾轉相除……逆元就行了……而且我以前抄寫的一篇的確有這麼寫的……
據某大佬說這裡只能消掉第一行第一列去求餘子式,好像是因為必須得消掉根節點
求餘子式的時候忘記變號了……調了半天……
//minamoto #include<bits/stdc++.h> #define R register #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i) #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i) #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v) using namespace std; char buf[1<<21],*p1=buf,*p2=buf; inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;} int read(){ R int res,f=1;R char ch; while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1); for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0'); return res*f; } const int N=255,P=10007; int n,m,G[N][N],u,v,res; inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;} inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;} int ksm(R int a,R int b){res=1;for(;b;b>>=1,a=a*a%P)if(b&1)res=res*a%P;return res;} int det(){ int ans=1,f=1,mx,t,inv; fp(i,2,n){ mx=i;fp(j,i+1,n)if(G[j][i]>G[mx][i])mx=j; if(mx!=i){fp(j,i,n)swap(G[i][j],G[mx][j]);f=-f;} inv=ksm(G[i][i],P-2); fp(j,i+1,n)if(G[j][i]){ t=G[j][i]*inv%P; fp(k,i,n)G[j][k]=dec(G[j][k],G[i][k]*t%P); }ans=ans*G[i][i]%P; }return add(f*ans,P); } int main(){ // freopen("testdata.in","r",stdin); n=read(),m=read(); fp(i,1,m)v=read(),u=read(),++G[v][v],--G[u][v]; fp(i,1,n)fp(j,1,n)if(G[i][j]<0)G[i][j]+=P; printf("%d\n",det());return 0; }