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工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
随机推荐
- 39.Linux应用调试-strace命令
1.strace简介 strace常用来跟踪进程执行时的系统调用和所接收的信号.通过strace可以知道应用程序打开了哪些文件,以及读写了什么内容,包括消耗的时间以及返回值等 2.安装strace命令 ...
- 为什么覆写equals()方法的时候总是要覆写hashcode()?
要回答这个问题,我们应该先认识一下obj中的equals和hascode方法 1.equals()方法在obj中定义如下: public boolean equals(Object obj) { re ...
- MySQL sql语句获取当前日期|时间|时间戳
1.1 获得当前日期+时间(date + time)函数:now() mysql> select now();+———————+| now() |+———————+| 2013-04-08 20 ...
- Python练习100则--部分概念的没有做
# coding = utf-8 import math, osfrom random import randint def Binary(): res = int(-1 / 2) res1 = in ...
- Chrome headless 模式
我们在通过Selenium运行自动化测试时,必须要启动浏览器,浏览器的启动与关闭必然会影响执行效率,而且还会干扰你做其它事情(本机运行的话). 那能不能把自动化测试的运行放在后台?当然可以! html ...
- vue2.0父子组件以及非父子组件如何通信
1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg" ...
- spring boot 遇到 supported setting property http://xml.org/sax/properties/lexical-handler
解决链接:http://apache-fop.1065347.n5.nabble.com/org-xml-sax-SAXNotSupportedException-thrown-by-FOP-td11 ...
- [Java] 在 jar 文件中读取 resources 目录下的文件
注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...
- Hibernate学习笔记(3)---hibernate关联关系映射
一对一关联 假设有两个持久化类(实体类)User与Address,它们之间存在一对一的关系 1,通过主键关联(个人偏向另外一种) User.hbm.xml文件配置 <id name=" ...
- RGB颜色 对照表
来自为知笔记(Wiz)