hdu5227 Tom and game(BestCoder Round #40)

Tom and game

 
 Accepts: 0
 
 Submissions: 12
 Time Limit: 6000/3000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
Tom喜欢和Tony玩游戏。
他们认为一个有序四元组(t,i,j,k)是合法的,当且仅当满足:
1、1i,j,kt
2、存在一个不小于k的正整数s,满足s既是i的约数,又是j的约数。
他们准备好一些四元组,两人轮流进行操作,不能操作的人就输了,一次合法操作的步骤是:
1、选择一个四元组A。
2、将A变成一个字典序比它小的合法四元组B。
比较两个四元组大小时,先比较第一个元素的大小,若相等,再比较第二个元素的大小,依此类推。
他们认为每次都重新准备四元组太麻烦了,所以他们画了一个树,树的每个点上都有一个四元组。每次游戏时,每个人都随机选择一个点,在树上画出连接这两个点的路径,将路径中所有点(包括这两个点)上的四元组抄下来进行游戏。
Tom每次都要做先手,他想知道他获胜的概率。
输入描述
输入包含多组数据(大约8组)。对于每组数据,第一行一个正整数n,表示树上有n个结点,从1开始编号。接下来n-1行,每行两个正整数i、j,表示i、j之间有一条边。接下来n行,第i行有四个正整数a、b、c、d,表示编号为i的点上的四元组是(a,b,c,d)。
1n10000;1i,jn;1a,b,c,d10000
保证每个结点上的四元组都是合法的。
输出描述
对于每组数据,输出一行一个分数"a/b",表示获胜概率,要求a、b互质。若必败,要输出"0/1"。
输入样例
2
1 2
1 1 1 1
2 1 2 1
5
1 2
2 3
3 4
4 5
1 1 1 1
2 1 1 1
2 1 2 1
2 2 1 1
1 1 1 1
输出样例
3/4
3/5
Problem D
概率就是(必胜的点对数/总点对数),总点对数是n2,我们需要考虑如何求必胜点对数。
这个游戏就像是Nim游戏,一个四元组就相当于一堆石头,石头的数量就是字典序比它小的合法四元组的个数,同时也是这个四元组的SG值。
考虑如何求字典序比(a,b,c,d)小的合法四元组(p,q,s,t)的数量:
1、p<a。可以预处理。所有第一个元素为n的合法四元组数量是
ni=1nj=1gcd(i,j)
预处理前缀和就行了。
2、p=a,q<b。满足这个条件的合法四元组数量是
b1i=1aj=1gcd(i,j)
3、p=a,q=b,s<c。满足这个条件的合法四元组数量是
c1i=1gcd(i,b)
4、p=a,q=b,s=c,t<d。满足这个条件的合法四元组数量是(d-1)。
上面的一些式子可以这样计算:
ni=1mj=1gcd(i,j)=ni=1mj=1d|i&d|jϕ(d)=min(n,m)d=1ϕ(d)ndmd
(除法为整除)
ndmd只会有O(n)种不同的值,相同的值需要一起计算,所以要预处理ϕ(d)及其前缀和。这样,一次计算的时间复杂度是O(n)的。
ni=1gcd(i,m)=ni=1d|i&d|mϕ(d)=d|mϕ(d)nd
(除法为整除)
m的约数不会太多,所以可以直接枚举d进行计算。为了快速找出m的约数,可以对m分解质因数。可以先预处理出10000以内所有数分解质因数的结果,为便于存储,可以只记录它的一个质因子,m除一下这个质因子,递归下去就能得到它的所有质因子。
这样,就能求出每个四元组的SG值了。
先手必胜当且仅当所有四元组SG值的异或和不为零。那么问题就变成了求树上有多少对点,满足连接它们的路径上所有点的SG值异或和不为零。可以通过点分治求解。
设m=max(a,b,c,d),那么
时间复杂度:O(nlog2n+(n+m)m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值