题意:给你一张有向图,求从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. [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度

    Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...

  2. vue-awesome-swipe 基于vue使用的轮播组件 使用(改)

    npm install vue-awesome-swiper --save  //基于vue使用的轮播组件 <template> <swiper :options="swi ...

  3. eCharts_数据过多底部滚动条实现数据展示

    效果图: 实现原理: 1.添加dataZoom属性 效果实现代码: <!DOCTYPE html> <html> <head> <meta charset=& ...

  4. python产生随机样本数据

    一.产生X样本 x_train = np.random.random((5, 3)) 随机产生一个5行3列的样本矩阵,也就是5个维度为3的训练样本. array([[ 0.56644011, 0.75 ...

  5. Java多线程学习(六)Lock锁的使用

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  6. LINUX中断学习笔记【转】

    转自:http://blog.chinaunix.net/uid-14825809-id-2381330.html 1.中断的注册与释放: 在 , 实现中断注册接口: int request_irq( ...

  7. Xmind 8 update5 破解

    Step 1. Download XMind Step 2. Run XMind at least once after installation, xmind will init the confi ...

  8. 系统调用wait()

    进程一旦调用了 wait,就 立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集这个子进程的信息, 并把它彻底销毁后返回: ...

  9. [New learn]讲解Objective-c的block知识

    1.简介 OC的Block感觉就是C中饿函数指针,提供回调功能,但是OC中的block比C的函数指针要更加强大,甚至可以访问本地变量和修改本地变量. block在oc中是一个对象,它可以像一般的对象那 ...

  10. Vim的分屏功能(转)

    注:本文属于转载,源地址:http://blog.csdn.net/ithomer/article/details/6035627(博主很牛,欢迎关注) 本篇文章主要教你如何使用 Vim 分屏功能 分 ...