zoukankan      html  css  js  c++  java
  • BZOJ4031: [HEOI2015]小Z的房间

    BZOJ4031: [HEOI2015]小Z的房间

    https://lydsy.com/JudgeOnline/problem.php?id=4031

    分析:

    • 矩阵树定理模板题。
    • 模数非质数,可能不存在逆元,需要用辗转相除的方法把对应项消成(0)

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define N 150
    #define mod 1000000000
    typedef long long ll;
    char mp[N][N];
    int idx[N][N],n,m,tot;
    int tx[]={0,1,-1,0};
    int ty[]={1,0,0,-1};
    ll a[N][N];
    ll Gauss(int n) {
    	int i,j,k,flg=0; ll del,ans=1;
    	for(i=1;i<=n;i++) {
    		for(j=i;j<=n&&!a[j][i];j++) ;
    		if(j>n) continue;
    		if(i!=j) {
    			for(k=i;k<=n;k++) swap(a[i][k],a[j][k]); 
    			flg^=1;
    		}
    		for(j=i+1;j<=n;j++) {
    			while(a[j][i]) {
    				del=a[j][i]/a[i][i];
    				for(k=i;k<=n;k++) a[j][k]=(a[j][k]-del*a[i][k])%mod;
    				if(!a[j][i]) break;
    				for(k=i;k<=n;k++) swap(a[i][k],a[j][k]);
    				flg^=1;
    			}
    		}
    	}
    	for(i=1;i<=n;i++) ans=ans*a[i][i]%mod;
    	if(flg) ans=-ans;
    	return (ans+mod)%mod;
    }
    int main() {
    	scanf("%d%d",&n,&m);
    	int i,j,k;
    	for(i=1;i<=n;i++) scanf("%s",mp[i]+1);
    	for(i=1;i<=n;i++) {
    		for(j=1;j<=m;j++) {
    			if(mp[i][j]=='.') {idx[i][j]=++idx[0][0];}
    		}
    	}
    	tot=idx[0][0]; 
    	for(i=1;i<=n;i++) {
    		for(j=1;j<=m;j++) if(mp[i][j]=='.') {
    			int x=i,y=j;
    			for(k=0;k<4;k++) {
    				int dx=x+tx[k], dy=y+ty[k];
    				if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&mp[dx][dy]=='.') {
    					a[idx[x][y]][idx[x][y]]++;
    					a[idx[x][y]][idx[dx][dy]]--;
    				}
    			}
    		}
    	}
    	printf("%lld
    ",Gauss(tot-1));
    }
    
    
  • 相关阅读:
    VS调试技巧
    Git 分支
    WPF:如何高速更新Model中的属性
    Redis-4.0.11集群配置
    大压力下Redis参数调整要点
    统计UPD丢包工具
    查看Redis集群所有节点内存工具
    Redis集群命令行部署工具
    查看Redis集群主从对应关系工具
    Redis集群master选举时长测试
  • 原文地址:https://www.cnblogs.com/suika/p/10229266.html
Copyright © 2011-2022 走看看