【Matrix-tree定理】【BEST Theorem】hdu6064 RXD and numbers
题意:给你一张有向图,求从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的更多相关文章
- BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)
题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...
- [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
- @总结 - 7@ 生成树计数 —— matrix - tree 定理(矩阵树定理)与 prüfer 序列
目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part ...
- 【证明与推广与背诵】Matrix Tree定理和一些推广
[背诵手记]Matrix Tree定理和一些推广 结论 对于一个无向图\(G=(V,E)\),暂时钦定他是简单图,定义以下矩阵: (入)度数矩阵\(D\),其中\(D_{ii}=deg_i\).其他= ...
- 数学-Matrix Tree定理证明
老久没更了,冬令营也延期了(延期后岂不是志愿者得上学了?) 最近把之前欠了好久的债,诸如FFT和Matrix-Tree等的搞清楚了(啊我承认之前只会用,没有理解证明--),FFT老多人写,而Matri ...
- SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)
题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...
- HDU 4305 Lightning Matrix Tree定理
题目链接:https://vjudge.net/problem/HDU-4305 解法:首先是根据两点的距离不大于R,而且中间没有点建立一个图.之后就是求生成树计数了. Matrix-Tree定理(K ...
- BZOJ.4894.天赋(Matrix Tree定理 辗转相除)
题目链接 有向图生成树个数.矩阵树定理,复习下. 和无向图不同的是,度数矩阵改为入度矩阵/出度矩阵,分别对应外向树/内向树. 删掉第i行第i列表示以i为根节点的生成树个数,所以必须删掉第1行第1列. ...
- BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)
题目链接 最小生成树有两个性质: 1.在不同的MST中某种权值的边出现的次数是一定的. 2.在不同的MST中,连接完某种权值的边后,形成的连通块的状态是一样的. \(Solution1\) 由这两个性 ...
随机推荐
- jQuery右侧悬浮楼层滚动 电梯菜单
http://www.kaiu.net/effectCon.aspx?id=2198 <!doctype html> <html> <head> <meta ...
- MACHINE_START与MACHINE_END【转】
转自:http://blog.csdn.net/cxw3506/article/details/8475965 版权声明:本文为博主原创文章,未经博主允许不得转载. 在移植Linux时,有个结构体需要 ...
- 手動設定 電池溫度 mtk platform
adb root adb shell echo "3 1 27" > ./proc/mtk_battery_cmd/battery_cmd 27 即是所要設定的溫度, 此設定 ...
- JAVA 线程状态及转化
线程状态图 说明:线程共包括以下5种状态.1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状 ...
- iOS 适配/ autoLayout基本知识
历史 iPhone3GS.iPhone4\4s:没有屏幕适配最早开发里面的程序全部都是写死的 iPad 旋转出来之后 Autoresizing问世iPhone5\5c\5s兼容各种不同的情况 系统适配 ...
- SQL语句获取时间的方法
1. 当前系统日期.时间select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值例如:向日期加上2天select dateadd(day ...
- 理解rest架构
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
- Python构造函数使用
1. 子类不定义构造函数时候,默认引用父类构造函数 class A(object): def __init__(self,name): self.name = name def run(self): ...
- c# 多线程多文件批量下载
废话少说,先演示一张效果图 简单说下过程喽 开发过程中其实总是会碰到项目想应用下载文件~ 看其他语言有很多封装好的类库可以使用~~ 作为小白的我并没有找到很多c#的案例可参考 后找到一款“MutThr ...
- 设置Eclipse/MyEclipse中编辑界面点击任何文件后Package Explorer导航自动定位该文件
原文:http://www.myexception.cn/eclipse/425836.html 设置步骤: 导航Package Explorer的右上角有一个黄色双向箭头图标,鼠标移动到上面提示“L ...