标签:algo 使用 tar include href -- ret pac php
来两道矩阵树模板:
这是一道典型的矩阵树裸题……
不过,这取模 10^9 不是质数,不能普通的高斯消元,要使用辗转相除法。
1 int f=1; 2 for(int i=1;i<cnt;i++){ 3 for(int j=i+1;j<=cnt;j++){ 4 while(a[j][i]){ 5 int t=a[j][i]/a[i][i]; 6 for(int k=i;k<=cnt;k++) 7 a[j][k]=(a[j][k]-1LL*a[i][k]*t%mod+mod)%mod; 8 if(a[j][i]==0)break; 9 for(int k=i;k<=cnt;k++)swap(a[i][k],a[j][k]); 10 f=-f; 11 } 12 } 13 }
这里涉及到交换,貌似统计答案要变为相反数……
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 #define mod 1000000000 6 int n,m,cnt,ans=1,a[100][100],id[10][10]; 7 char s[10]; 8 9 int qpow(int x,int y){ 10 int ans=1; 11 while(y){ 12 if(y&1)ans=1LL*ans*x%mod; 13 y>>=1,x=1LL*x*x%mod; 14 } 15 return ans; 16 } 17 18 int main(){ 19 scanf("%d%d",&n,&m); 20 for(int i=1;i<=n;i++){ 21 scanf("%s",s+1); 22 for(int j=1;j<=m;j++){ 23 if(s[j]==‘*‘)continue; 24 id[i][j]=++cnt; 25 if(id[i-1][j]){ 26 a[id[i-1][j]][id[i][j]]--; 27 a[id[i][j]][id[i-1][j]]--; 28 a[id[i][j]][id[i][j]]++; 29 a[id[i-1][j]][id[i-1][j]]++; 30 }if(id[i][j-1]){ 31 a[id[i][j-1]][id[i][j]]--; 32 a[id[i][j]][id[i][j-1]]--; 33 a[id[i][j]][id[i][j]]++; 34 a[id[i][j-1]][id[i][j-1]]++; 35 } 36 } 37 } 38 cnt--; 39 for(int i=1;i<=cnt;i++) 40 for(int j=1;j<=cnt;j++) 41 if(a[i][j]<0)a[i][j]+=mod; 42 int f=1; 43 for(int i=1;i<cnt;i++){ 44 for(int j=i+1;j<=cnt;j++){ 45 while(a[j][i]){ 46 int t=a[j][i]/a[i][i]; 47 for(int k=i;k<=cnt;k++) 48 a[j][k]=(a[j][k]-1LL*a[i][k]*t%mod+mod)%mod; 49 if(a[j][i]==0)break; 50 for(int k=i;k<=cnt;k++)swap(a[i][k],a[j][k]); 51 f=-f; 52 } 53 } 54 } 55 for(int i=1;i<=cnt;i++) 56 ans=1LL*ans*a[i][i]%mod; 57 printf("%d",~f?ans:(mod-ans)%mod); 58 }
这是一道有向图生成树计数的裸题……
没什么好说的。
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 #define mod 1000000007 6 char s[305]; 7 int n,a[305][305],ans=1; 8 9 int qpow(int x,int y){ 10 int ans=1; 11 while(y){ 12 if(y&1)ans=1LL*ans*x%mod; 13 y>>=1,x=1LL*x*x%mod; 14 } 15 return ans; 16 } 17 18 void Gauss(){ 19 for(int i=2;i<n;i++){ 20 for(int j=i+1;j<=n;j++){ 21 if(a[j][i]==0)continue; 22 if(a[i][i]==0){ 23 putchar(‘0‘); 24 exit(0); 25 } 26 int tmp=1ll*a[j][i]*qpow(a[i][i],mod-2)%mod; 27 for(int k=i;k<=n;k++) 28 a[j][k]=(a[j][k]-1ll*a[i][k]*tmp%mod+mod)%mod; 29 } 30 } 31 } 32 33 int main(){ 34 scanf("%d",&n); 35 for(int i=1;i<=n;i++){ 36 scanf("%s",s+1); 37 for(int j=1;j<=n;j++) 38 if(s[j]==‘1‘)a[j][i]=-1,a[j][j]++; 39 } 40 for(int i=2;i<=n;i++) 41 for(int j=2;j<=n;j++) 42 if(a[i][j]<0)a[i][j]+=mod; 43 Gauss(); 44 for(int i=2;i<=n;i++) 45 ans=1LL*ans*a[i][i]%mod; 46 printf("%d",ans); 47 }
【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)
标签:algo 使用 tar include href -- ret pac php
原文地址:https://www.cnblogs.com/ezoiLZH/p/9388938.html