[ZJOI2013]抛硬币
题号:NC20509
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

有一枚硬币,抛出正面H的概率为a/b,抛出反面T的概率为1-a/b。现在TT小朋友开始玩丢硬币的游戏,并且把每次抛出的结果记录下来,正面记为H,反面记为T,于是她得到了一个抛硬币序列HTHHT…。她突然想到一个问题:在抛出正面和反面概率都是1/2的情况下,要使得抛出的序列出现目标序列HT,期望要抛多少次。然而经过1秒的思考以后她发现,若第一次抛出的是T,那么还需要期望抛出HT的次数,如果第一次抛出的是H,则期望只需要抛出T的次数,而期望抛出T的次数显然是2。她设抛出HT的期望次数是x,则得到了方程:x=1+(1/2*x+1/2*2) 解得x=4,所以抛出HT的期望次数是4次。她在解决了这个弱化很多的问题以后,开始思考对于一般情况下,抛出正反面的概率不一定相同,且抛出的目标序列不一定为HT时需要的期望步数。然而经过很长一段时间的苦思冥想仍然无果,于是她开始求助于你。

输入描述:

第一行两个数a,b。意义如题目描述。
接下来1行一个只包含’H’和’T’的字符串S。表示要抛出的目标序列。
a=b,b=100,|s|<=1000

输出描述:

输出仅一行p/q,其中p和q均为正整数且互质,表示抛出目标序列S所需要的期望步数。
注意,若q为1时,不省略/1。
示例1

输入

复制
1 2
HT

输出

复制
4/1

备注:

50%数据a=1,b=2,|s|<=20 
100%数据a=b,b=100,|s|<=1000