zoukankan      html  css  js  c++  java
  • 小Z的房间 (辗转相除gauss)

    gauss求解行列式时

    如果模数不是质数,那么就要用到辗转相除法来消元

    (为什么使用第 j 行减第 i 行啊qaq)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<cmath>
    #include<stack>
    #include<queue>
    using namespace std;
    typedef long long ll;
    
    const int maxn = 1000;
    const int P = 1e9;
    
    int n,m,cnt,ans;
    int a[maxn][maxn],b[maxn][maxn],d[maxn][maxn],c[maxn][maxn];
    char ch[maxn][maxn];
    
    void add(int u,int v){ d[u][u]++,c[u][v]=1; }
    
    void gauss(){
        ans=1;
        int f=1;
        for(int i=2;i<=cnt;i++){
            for(int j=i+1;j<=cnt;j++){
                int x=a[i][i],y=a[j][i];
                while(y){
                    int t=x/y; x%=y; swap(x,y);
                    for(int k=i;k<=cnt;k++){
                        a[i][k]=(a[i][k]-1ll*t*a[j][k]%P+P)%P;
                        swap(a[i][k],a[j][k]);
                    }
                    f=-f;
                }
            }
            if(!a[i][i]){ ans=0; return; }
            ans=1ll*ans*a[i][i]%P;
        }
        if(f==-1) ans=(P-ans)%P;
    }
    
    ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; }
    
    int main(){
        n=read(),m=read();
        for(int i=1;i<=n;i++){ scanf("%s",ch[i]); }
        for(int i=1;i<=n;i++) for(int j=0;j<m;j++) if(ch[i][j]=='.') b[i][j+1]=++cnt;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(b[i][j]){
                    if(i-1>0 && b[i-1][j]) add(b[i][j],b[i-1][j]);
                    if(j-1>0 && b[i][j-1]) add(b[i][j],b[i][j-1]);
                    if(i+1<=n && b[i+1][j]) add(b[i][j],b[i+1][j]);
                    if(j+1<=m && b[i][j+1]) add(b[i][j],b[i][j+1]);
                }
            }
        }
        
        for(int i=1;i<=cnt;i++){
            for(int j=1;j<=cnt;j++){
                if(i==j) a[i][j]=d[i][j];
                else a[i][j]=(a[i][j]-c[i][j]+P)%P;
            }
        }
        
        gauss();
        printf("%d\n",ans);
        
        return 0;
    }
  • 相关阅读:
    技术选型总结
    这些年来收集的好用的好玩的软件,强烈推荐给大家
    如何解决markdown中图片上传的问题
    01.如何把.py文件打包成为exe,重点讲解pyinstaller的用法
    Asp.net中汉字转换成为拼音
    程序员常用网址收集
    通过IP来判断所在城市
    以太坊
    分布式系统领域经典论文翻译集
    T50
  • 原文地址:https://www.cnblogs.com/tuchen/p/10352092.html
Copyright © 2011-2022 走看看