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、
1≤i,j,k≤t
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)。
1≤n≤10000;1≤i,j≤n;1≤a,b,c,d≤10000
保证每个结点上的四元组都是合法的。
输出描述
对于每组数据,输出一行一个分数"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=1∑nj=1gcd(i,j) 预处理前缀和就行了。 2、p=a,q<b。满足这个条件的合法四元组数量是 ∑b−1i=1∑aj=1gcd(i,j) 3、p=a,q=b,s<c。满足这个条件的合法四元组数量是 ∑c−1i=1gcd(i,b) 4、p=a,q=b,s=c,t<d。满足这个条件的合法四元组数量是(d-1)。 上面的一些式子可以这样计算: ∑ni=1∑mj=1gcd(i,j)=∑ni=1∑mj=1∑d|i&d|jϕ(d)=∑min(n,m)d=1ϕ(d)⋅nd⋅md (除法为整除) nd、md 只会有O( n√ )种不同的值,相同的值需要一起计算,所以要预处理 ϕ(d) 及其前缀和。这样,一次计算的时间复杂度是O( n√ )的。 ∑ni=1gcd(i,m)=∑ni=1∑d|i&d|mϕ(d)=∑d|mϕ(d)⋅nd (除法为整除) m的约数不会太多,所以可以直接枚举d进行计算。为了快速找出m的约数,可以对m分解质因数。可以先预处理出10000以内所有数分解质因数的结果,为便于存储,可以只记录它的一个质因子,m除一下这个质因子,递归下去就能得到它的所有质因子。 这样,就能求出每个四元组的SG值了。 先手必胜当且仅当所有四元组SG值的异或和不为零。那么问题就变成了求树上有多少对点,满足连接它们的路径上所有点的SG值异或和不为零。可以通过点分治求解。 设 m=max(a,b,c,d) ,那么 时间复杂度:O( n⋅log2n+(n+m)m−−√ )