zoukankan      html  css  js  c++  java
  • BZOJ4894: 天赋

    BZOJ4894: 天赋

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

    分析:

    • 外向树,用入度矩阵减去出度矩阵。
    • 删去的那一行一列是根对应的一行一列。

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define N 305
    #define mod 1000000007
    typedef long long ll;
    int n,mp[N][N],d[N][N];
    ll a[N][N];
    ll qp(ll x,ll y) {
    	ll re=1;for(;y;y>>=1,x=x*x%mod) if(y&1) re=re*x%mod; return re;
    }
    ll Gauss(int n) {
    	int i,j,k; ll del,ans=1; int flg=0;
    	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++) if(a[j][i]) {
    			del=a[j][i]*qp(a[i][i],mod-2)%mod;
    			for(k=i;k<=n;k++) a[j][k]=(a[j][k]-a[i][k]*del)%mod;
    		}
    	}
    	for(i=1;i<=n;i++) ans=ans*a[i][i]%mod;
    	if(flg) ans=-ans;
    	return (ans+mod)%mod;
    }
    int main() {
    	scanf("%d",&n);
    	int i,j;
    	for(i=0;i<n;i++) {
    		for(j=0;j<n;j++) {
    			scanf("%01d",&mp[i][j]);
    			if(mp[i][j]) d[j][j]++;
    		}
    	}
    	for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=(d[i][j]-mp[i][j]);
    	printf("%lld
    ",Gauss(n-1));
    }
    
  • 相关阅读:
    jq 的简单循环
    简单的下拉菜单
    jQ事件
    图片移动
    选中效果
    js 时间
    简单的密码验证
    DOM 的简介 和一些方法
    Java编程思想笔记
    Java并发笔记(二)
  • 原文地址:https://www.cnblogs.com/suika/p/10229711.html
Copyright © 2011-2022 走看看