【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\) 由这两个性 ...
随机推荐
- Eureka服务下线(Cancel)源码分析
Cancel(服务下线) 在Service Provider服务shut down的时候,需要及时通知Eureka Server把自己剔除,从而避免其它客户端调用已经下线的服务,导致服务不可用. co ...
- Yii 1.1.17 三、数据库连接、定义模型、数据查询、验证登录、SESSION使用与URL生成
一.数据库连接 1.配置连接参数 在database.php里面开启: 'db' => array( 'connectionString' => 'mysql:host=127.0.0.1 ...
- 浅谈linux的死锁检测 【转】
转自:http://www.blog.chinaunix.net/uid-25942458-id-3823545.html 死锁:就是多个进程(≥2)因为争夺资源而相互等待的一种现象,若无外力推动,将 ...
- OpenRCT2-ext
https://github.com/RollingStar/RCT-Music-Patch https://github.com/seanfisk/rct2-game-objects https:/ ...
- Redis在CentOS 7上的安装部署
简介: Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集( ...
- [ python ] 项目二:主机批量管理程序
开发要求: 1. 对主机进行批量管理 2. 可对单台或主机组批量执行命令 3. 可上传文件到对应的主机或组 4. 使用多线程实现 程序: 1. README # 作者:hkey # ...
- jquery获取元素索引值index()的例子
如果参数是一组DOM元素或者jQuery对象,那么返回值就是传递的元素相对于原先集合的位置. 如果参数是一个选择器,那么返回值就是原先元素相对于选择器匹配元素中的位置.如果找不到匹配的元素,则返回-1 ...
- JavaScript 正则表达式的入门与使用
知道正则表达式已经很久了,粗略会看懂一些,不过以前没有系统的学习,最近在看<JS权威指南>,刚好看到了看到正则表达式部分,就比较系统的学习了正则表达式. 先说一下正则表达式的一些基本知识 ...
- ubuntu下ssh服务相关操作
1.安装ssh服务:apt-get install openssh-server 2.检测ssh开启状态:ps -e | grep ssh 3.启动ssh:/etc/init.d/ssh start ...
- go run/ go install/ go build / go get的区别
go run 运行当个.go文件 go install 在编译源代码之后还安装到指定的目录 go build 加上可编译的go源文件可以得到一个可执行文件 go get = git clone + g ...