题意:给你一张有向图,求从1出发,回到1的欧拉回路数量。

先特判掉欧拉回路不存在时的情况。

看这个吧:http://blog.csdn.net/yuanjunlai141/article/details/76691680。

这是求有向图(以某个点为根的)生成外向树的方法。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll MOD=998244353ll;
int n,a[405][405],chu[405],ru[405];
ll A[405][405],jc[200005];
int sum;
bool vis[405];
void dfs(int U){
++sum;
vis[U]=1;
for(int i=1;i<=n;++i){
if(a[U][i] && !vis[i]){
dfs(i);
}
}
}
ll Quick_Pow(ll a,ll p){
if(!p){
return 1ll;
}
ll res=Quick_Pow(a,p>>1);
res=res*res%MOD;
if((p&1ll)==1ll){
res=a%MOD*res%MOD;
}
return res;
}
ll guass_jordan()
{
if(n==2){
return A[2][2];
}
for(int i=2;i<=n;++i){
for(int j=2;j<=n;++j){
A[i-1][j-1]=A[i][j];
}
}
ll res=1;
for(int i=1;i<n;++i)
{
int pivot=i;
for(int j=i+1;j<n;++j)
if(A[j][i]){
pivot=j;
break;
}
swap(A[i],A[pivot]);
if(i!=pivot){
res=res*(MOD-1ll)%MOD;
}
if(A[i][i]==0){
return 0;
}
ll ni=Quick_Pow(A[i][i],MOD-2ll);
for(int j=i+1;j<n;++j)
A[i][j]=A[i][j]*ni%MOD;
res=res*A[i][i]%MOD;
for(int j=1;j<n;++j)
if(i!=j)
for(int k=i+1;k<n;++k)
A[j][k]=(A[j][k]-A[j][i]*A[i][k]%MOD+MOD)%MOD;
}
return res;
}
int main(){
// freopen("hdu6064.in","r",stdin);
jc[0]=1;
for(int i=1;i<=200000;++i){
jc[i]=jc[i-1]*(ll)i%MOD;
}
int zu=0;
while(scanf("%d",&n)!=EOF){
++zu;
printf("Case #%d: ",zu);
if(n==1){
puts("1");
continue;
}
memset(A,0,sizeof(A));
memset(chu,0,sizeof(chu));
memset(ru,0,sizeof(ru));
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
scanf("%d",&a[i][j]);
}
}
bool flag=1;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
ru[i]+=a[j][i];
chu[i]+=a[i][j];
if(j!=i){
A[i][i]=(A[i][i]+(ll)a[j][i])%MOD;
if(a[i][j]){
A[i][j]=MOD-a[i][j];
}
}
}
if(ru[i]!=chu[i]){
flag=0;
break;
}
}
if(!flag){
puts("0");
continue;
}
sum=0;
memset(vis,0,sizeof(vis));
dfs(1);
if(sum!=n){
puts("0");
continue;
}
ll ans=guass_jordan()*jc[ru[1]]%MOD;
for(int i=2;i<=n;++i){
ans=ans*jc[(ru[i]-1)]%MOD;
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
ans=ans*Quick_Pow(jc[a[i][j]],MOD-2ll)%MOD;
}
}
printf("%lld\n",ans);
}
return 0;
}

【Matrix-tree定理】【BEST Theorem】hdu6064 RXD and numbers的更多相关文章

  1. BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)

    题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...

  2. [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)

    Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...

  3. @总结 - 7@ 生成树计数 —— matrix - tree 定理(矩阵树定理)与 prüfer 序列

    目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part ...

  4. 【证明与推广与背诵】Matrix Tree定理和一些推广

    [背诵手记]Matrix Tree定理和一些推广 结论 对于一个无向图\(G=(V,E)\),暂时钦定他是简单图,定义以下矩阵: (入)度数矩阵\(D\),其中\(D_{ii}=deg_i\).其他= ...

  5. 数学-Matrix Tree定理证明

    老久没更了,冬令营也延期了(延期后岂不是志愿者得上学了?) 最近把之前欠了好久的债,诸如FFT和Matrix-Tree等的搞清楚了(啊我承认之前只会用,没有理解证明--),FFT老多人写,而Matri ...

  6. SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)

    题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...

  7. HDU 4305 Lightning Matrix Tree定理

    题目链接:https://vjudge.net/problem/HDU-4305 解法:首先是根据两点的距离不大于R,而且中间没有点建立一个图.之后就是求生成树计数了. Matrix-Tree定理(K ...

  8. BZOJ.4894.天赋(Matrix Tree定理 辗转相除)

    题目链接 有向图生成树个数.矩阵树定理,复习下. 和无向图不同的是,度数矩阵改为入度矩阵/出度矩阵,分别对应外向树/内向树. 删掉第i行第i列表示以i为根节点的生成树个数,所以必须删掉第1行第1列. ...

  9. BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)

    题目链接 最小生成树有两个性质: 1.在不同的MST中某种权值的边出现的次数是一定的. 2.在不同的MST中,连接完某种权值的边后,形成的连通块的状态是一样的. \(Solution1\) 由这两个性 ...

随机推荐

  1. 【洛谷 P3402】 【模板】可持久化并查集

    题目链接 可持久化并查集,就是用可持久化线段树维护每个版本每个节点的父亲,这样显然是不能路径压缩的,否则我们需要恢复太多状态. 但是这并不影响我们启发式合并,于是,每次把深度小的连通块向深度大的上并就 ...

  2. 【HNOI】 小A的树 tree-dp

    [题目描述]给定一颗树,每个点有各自的权值,任意选取两个点,要求算出这两个点路径上所有点的and,or,xor的期望值. [数据范围]n<=10^5 首先期望可以转化为求树上所有点对的and,o ...

  3. web_一些常用的线上脚本地址记录(个人使用)

    1.jquery <script src="http://code.jquery.com/jquery-1.4.1.min.js"></script> 2. ...

  4. Solaris 选择使用不同网口的操作

    机器上集成两个物理网口,由于先前使用的网口传输速率特别慢且容易丢包,故换成另一个网口,操作如下: 1.查看物理设备信息-- 显示可用的数据链路 root@238-spa:~# dladm show-p ...

  5. 分类算法:决策树(C4.5)(转)

    C4.5是机器学习算法中的另一个分类决策树算法,它是基于ID3算法进行改进后的一种重要算法,相比于ID3算法,改进有如下几个要点: 1)用信息增益率来选择属性.ID3选择属性用的是子树的信息增益,这里 ...

  6. centos_7.1.1503_src_3

    http://vault.centos.org/7.1.1503/os/Source/SPackages/ kdf-4.10.5-3.el7.src.rpm 05-Jul-2014 13:28 161 ...

  7. python的时间和日期--time、datetime应用

    time >>> import time >>> time.localtime() #以time.struct_time类型,打印本地时间 time.struct_ ...

  8. glom模块的使用(一)

    glom模块的使用 简单说下glom模块主要是处理结构化数据用的,安装简单pip install glom即可,下面就glom的方法参数做例子讲解. glom 和模块同名的glom方法使用方法: .g ...

  9. 微信小程序的下拉刷新

    微信小程序的下拉刷新:在page的js文件中有监听用户下拉刷新的处理函数onPullDownRefresh:function(){} //js文件中自带的处理函数,在onUnload下面,注意不要重复 ...

  10. Java Socket编程基础篇

    原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Sock ...