码迷,mamicode.com
首页 > 其他好文 > 详细

[BZOJ4894]天赋

时间:2018-04-21 11:19:12      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:char   getc   ace   names   print   using   turn   com   矩阵   

bzoj

sol

矩阵树定理裸题
其实可以不用辗转相除直接乘逆元就好了。然而我还是写的辗转相除

code

#include<cstdio>
#include<algorithm>
using namespace std;
int gi()
{
    int x=0,w=1;char ch=getchar();
    while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if (ch=='-') w=0,ch=getchar();
    while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return w?x:-x;
}
const int N = 305;
const int mod = 1e9+7;
int n,a[N][N],ans=1;char s[N][N];
int main()
{
    n=gi();
    for (int i=1;i<=n;++i)
    {
        scanf("%s",s[i]+1);
        for (int j=1;j<=n;++j)
            if (s[i][j]=='1') a[i][j]--,a[j][j]++;
    }
    for (int i=1;i<=n;++i)
        for (int j=1;j<=n;++j)
            a[i][j]=(a[i][j]+mod)%mod;
    for (int i=2;i<=n;++i)
    {
        for (int j=i+1;j<=n;++j)
            while (a[j][i])
            {
                int t=a[i][i]/a[j][i];
                for (int k=i;k<=n;++k) a[i][k]=(a[i][k]-1ll*t*a[j][k]%mod+mod)%mod,swap(a[i][k],a[j][k]);
                ans=(mod-ans)%mod;
            }
        ans=1ll*ans*a[i][i]%mod;
    }
    printf("%d\n",ans);return 0;
}

[BZOJ4894]天赋

标签:char   getc   ace   names   print   using   turn   com   矩阵   

原文地址:https://www.cnblogs.com/zhoushuyu/p/8899076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!