任意门

为了在漫长得飞行旅途中娱乐,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的更多相关文章

  1. CF467D Fedor and Essay 建图DFS

      Codeforces Round #267 (Div. 2) CF#267D D - Fedor and Essay D. Fedor and Essay time limit per test ...

  2. cf467B Fedor and New Game

    B. Fedor and New Game time limit per test 1 second memory limit per test 256 megabytes input standar ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. [CF467D] Fedor and Essay

    After you had helped Fedor to find friends in the «Call of Soldiers 3» game, he stopped studying com ...

  8. 基于C/S架构的3D对战网络游戏C++框架 _【不定期更新通知】

    由于笔者最近有比赛项目要赶,这个基于C/S架构的3D对战网络游戏C++框架也遇到了一点瓶颈需要点时间沉淀,所以近一段时间不能保证每天更新了,会保持不定期更新.同时近期笔者也会多分享一些已经做过学过的C ...

  9. 基于C/S架构的3D对战网络游戏C++框架 _01服务器端与客户端需求分析

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

随机推荐

  1. 小白的Python之路 day2 文件操作

    文件操作 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  2. 多表连接时USING和ON的区别,USING会去掉重复列,ON显示重复列。

  3. ASP.NET Core 系列视频完结,新项目实战课程发布。

    今天把MVC的章节完成了,给大家从头到尾做了一个登录注册的示例,带前后端Model验证,算是完整的示例.同时借助于eShopOnContainers的示例也做了一个DBContextSeed的包装器来 ...

  4. .NET开发一个微信跳一跳辅助程序

    昨天微信更新了,出现了一个小游戏"跳一跳",玩了一下 赶紧还蛮有意思的 但纯粹是拼手感的,玩了好久,终于搞了个135分拿了个第一名,没想到过一会就被朋友刷下去了,最高的也就200来 ...

  5. C:数据结构与算法之单链表

    单链表相对于顺序表比较难理解,但是比较实用,单链表的插入,删除不需要移动数据元素,只需要一个指针来寻找所需要的元素,还有一个大优点就是不浪费空间,当你想要增加一个结点可以申请(malloc())一个结 ...

  6. Time Complexity of Loop with Powers

    以下功能的时间复杂度是多少? void fun(int n, int k) { for (int i=1; i<=n; i++) { int p = pow(i, k); for (int j= ...

  7. ECMAScript中的两种属性

    数据属性 数据属性包含一个数据值的位置.在这个位置可以读取和写入值.数据属性一般用于存储数据数值. 数据属性有4个描述其行为的特征. configurable:true/false,是否可以通过del ...

  8. Spring Dynamic DataSource Routing

    Use AbstractRoutingDataSource to dynamicly switch datasources, see http://spring.io/blog/2007/01/23/ ...

  9. Linux发行版 CentOS6.5 修改默认主机名

    修改前准备 我们将主机名修改为comexchan.cnblogs.com(本文发布于http://comexchan.cnblogs.com/) 备份相关配置文件,以便回滚 cp /etc/sysco ...

  10. Spark源码剖析(八):stage划分原理与源码剖析

    引言 对于Spark开发人员来说,了解stage的划分算法可以让你知道自己编写的spark application被划分为几个job,每个job被划分为几个stage,每个stage包括了你的哪些代码 ...