hackerrank Alex对战Fedor
为了在漫长得飞行旅途中娱乐,Alex和Fedor发明了如下的一个简单的双人游戏。游戏是:
首先, Alex画一个有权无向图。该图中可能有多重边(多重边的权值可能相同或者不同)。
然后,Fedor选取该图的一个生成树。如果该树是这个图的最小生成树,则Fedor获胜。否则,Alex获胜。
如果两棵树分别包含的边标号形成的两个集合不相同,我们认为这两棵树不同。两个集合A和B,如果至少存在一个元素在A中但不在B中,或者反之,至少存在一个元素在B中但不在A中,则我们认为这两个集合不同。
我们还要指出图拥有太多的生成树会让Alex和Fedor烦乱,于是他们不会用多于$10^{18}$棵生成树的图进行游戏。
现在, Fedor懒得找最小生成树了,于是他会任选一个Alex的图的生成树。每棵生成树被Fedor选择的概率相同。请问此时Fedor获胜的概率是多少?
裸的矩阵树定理,但是这玩意卡精度,卡了我一个多小时……把long double换成__float128就过了,要是还卡估计就得强行取模+CRT了。
#include<cassert>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MN 401
#define ld __float128
#define ll long long
#define int long long
using namespace std; int read_p,read_ca,read_f;
inline int read(){
read_p=;read_ca=getchar();read_f=;
while(read_ca<''||read_ca>'') read_f=read_ca=='-'?-:read_f,read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p*read_f;
}
struct na{int x,y,z;}b[MN];
bool operator < (na a,na b){return a.z<b.z;}
int n,m,a[MN][MN],fa[MN],s[MN];
ll mmh,MMH,o;
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
ld _abs(ld x){return x<?-x:x;}
ll gauss(int n){
static ld b[MN][MN];
int i,j,k;
ld x=;
for (i=;i<=n;i++)
for (j=;j<=n;j++) b[i][j]=a[i][j];
for (i=;i<=n;i++){
for (j=i;j<=n;j++) if (_abs(b[j][i])>_abs(b[i][i]))
for (k=i;k<=n;k++) swap(b[j][k],b[i][k]);
for (j=i+;j<=n;j++){
ld s=b[j][i];
for (k=i;k<=n;k++) b[j][k]-=b[i][k]/b[i][i]*s;
}
x*=b[i][i];
}
return (ll)(_abs(x)+0.5);
}
int gf(int x){return x==fa[x]?x:fa[x]=gf(fa[x]);}
inline void add(int x,int y){x=gf(x);y=gf(y);fa[x]=y;}
bool cmp(na a,na b){return gf(a.x)<gf(b.x);}
inline ll work(int l,int r){
for (int i=;i<=n;i++) s[i]=;
for (int i=l;i<r;i++)
if (b[i].x!=b[i].y) s[b[i].x]=,s[b[i].y]=;
for (int i=;i<=n;i++) s[i]+=s[i-];
for (int i=;i<=s[n];i++)
for (int j=;j<=s[n];j++) a[i][j]=;
memset(a,,sizeof(a));
for (int i=l;i<r;i++)
if (b[i].x=s[b[i].x],b[i].y=s[b[i].y],b[i].x!=b[i].y)
a[b[i].x][b[i].y]--,a[b[i].y][b[i].x]--,a[b[i].x][b[i].x]++,a[b[i].y][b[i].y]++;
return gauss(s[n]);
}
ll Mavis(){
ll mmh=;
sort(b+,b++m);
for (int i=,j=;i<=m;i=j){
while (b[j].z==b[i].z&&j<=m) j++;
for (int k=i;k<j;k++) b[k].x=gf(b[k].x),b[k].y=gf(b[k].y);
for (int k=i;k<j;k++) add(b[k].x,b[k].y);
sort(b+i,b+j,cmp);
for (int k=i,l=i;k<j;k=l){
while (l<j&&gf(b[l].x)==gf(b[k].x)) l++;
mmh*=work(k,l);
}
}
for (int i=;i<=n;i++) if (gf(i)!=gf()) return ;
return mmh;
}
signed main(){
n=read();m=read();
for (int i=;i<=n;i++) fa[i]=i;
for (int i=;i<=m;i++)
b[i].x=read(),b[i].y=read(),b[i].z=read(),
a[b[i].x][b[i].y]--,a[b[i].y][b[i].x]--,a[b[i].x][b[i].x]++,a[b[i].y][b[i].y]++;
mmh=gauss(n);MMH=Mavis();o=gcd(mmh,MMH);if (o) mmh/=o,MMH/=o;
printf("%lld/%lld\n",MMH,mmh);
}
hackerrank Alex对战Fedor的更多相关文章
- CF467D Fedor and Essay 建图DFS
Codeforces Round #267 (Div. 2) CF#267D D - Fedor and Essay D. Fedor and Essay time limit per test ...
- cf467B Fedor and New Game
B. Fedor and New Game time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Codeforces Round #267 (Div. 2) D. Fedor and Essay tarjan缩点
D. Fedor and Essay time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #267 (Div. 2) B. Fedor and New Game【位运算/给你m+1个数让你判断所给数的二进制形式与第m+1个数不相同的位数是不是小于等于k,是的话就累计起来】
After you had helped George and Alex to move in the dorm, they went to help their friend Fedor play ...
- CodeForces 467D(267Div2-D)Fedor and Essay (排序+dfs)
D. Fedor and Essay time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #267 (Div. 2) B. Fedor and New Game
After you had helped George and Alex to move in the dorm, they went to help their friend Fedor play ...
- [CF467D] Fedor and Essay
After you had helped Fedor to find friends in the «Call of Soldiers 3» game, he stopped studying com ...
- 基于C/S架构的3D对战网络游戏C++框架_【不定期更新通知】
由于笔者最近有比赛项目要赶,这个基于C/S架构的3D对战网络游戏C++框架也遇到了一点瓶颈需要点时间沉淀,所以近一段时间不能保证每天更新了,会保持不定期更新.同时近期笔者也会多分享一些已经做过学过的C ...
- 基于C/S架构的3D对战网络游戏C++框架_01服务器端与客户端需求分析
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
随机推荐
- springboot 结合mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- KVM_虚拟化技术
1 什么是 KVM KVM 是指基于 Linux 内核的虚拟机(Kernel-based Virtual Machine). 2006 年 10 月,由以色列的 Qumranet 组织开发的一种新的“ ...
- 如何给动态添加的form表单控件添加表单验证
最近使用jQuery Validate做表单验证很方便,api地址为http://www.runoob.com/jquery/jquery-plugin-validate.html 但是在使用的时候也 ...
- MySQL sql语句获取当前日期|时间|时间戳
1.1 获得当前日期+时间(date + time)函数:now() mysql> select now();+———————+| now() |+———————+| 2013-04-08 20 ...
- NOI 2009 诗人小G
题目描述 Description 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行 ...
- flask入门篇
flask,Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . Flask简单易学,属于轻量级的,学起来 ...
- Effective Java 第三版——13. 谨慎地重写 clone 方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Q:算法(第四版)—第一章
1.1.14:编写一个静态方法lg(),接受一个整型参数N,返回不大于log2N的最大整数(ps:不使用Math库) 分析: 利用将公式k=log2N转化为N=2k的原理,不断的逼近其输入的值N,当N ...
- AJAX结合PHP整理复习
Ajax主要的功能是实现了浏览器端 异步 访问服务器:通过浏览器的XMLHttpRequest对象发出小部分数据,与服务端进行交互,服务端返回小部分数据,然后更新客户端的部分页面. 下图是一次请求成功 ...
- JavaScript的DOM编程--07--节点的属性
节点的属性: 1). nodeName: 代表当前节点的名字. 只读属性. 如果给定节点是一个文本节点, nodeName 属性将返回内容为 #text 的字符串 2). nodeType:返回一个整 ...