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
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值