编程题

燃烧权杖

题目描述

小 C 最近迷上了一款游戏。现在,在游戏中,小 C 有一个英雄,生命值为 x;敌人也有一个英雄,生命值为 y。

除此以外,还有 k 个士兵,生命值分别为a1 、a2 、……、ak,现在小 C 打算使用一个叫做“燃烧权杖”的技能。

“燃烧权杖”会每次等概率随机选择一个活着的角色(英雄或士兵),扣减其 10 点生命值,

然后如果该角色的生命值小于或等于 0,则该角色死亡,不会再被“燃烧权杖”选中。

“燃烧权杖”会重复做上述操作,直至任意一名英雄死亡。

小 C 想知道使用“燃烧权杖”后敌方英雄死亡(即,小 C 的英雄存活)的概率。

为了避免精度误差,你只需要输出答案模一个质数 p 的结果,具体见输出格式。

输入格式

输入包含多组数据。

输入第一行包含一个正整数 T,表示数据组数。

接下来 T 组,每组数据第一行包含四个非负整数 x, y, p, k,分别表示小C的英雄的生命值、敌方英雄的生命值,模数和士兵个数。

第二行包含 k 个正整数 a1 、a2 、……、ak ,分别表示每个士兵的生命值。

输出格式

对于每组数据,输出一行一个非负整数,表示答案模质数 p 的余数。可以证明,答案一定为有理数。

设答案为 a / b(a 和 b 为互质的正整数),你输出的数为 x,则你需要保证 a 与 bx 模 p 同余;

也即,x = (a·b−1 ) mod p,其中 b−1 表示 b 模 p 的逆元, mod 为取模运算。

样例输入

6

1 10 101 0

100 1 101 0

50 30 4903 2

1 1

987 654 233 1

321

1000000000 999999999 233 3

1 2 3

1000000000 999999999 3 3

1 2 3

样例输出

51

37

1035

118

117

2

样例说明

对于第一组数据,所求概率即为“燃烧权杖”第一次就扣减敌方英雄 10 点生命值的概率,即 1/2。2 × 51 模 101 余 1。

对于第二组数据,答案为 1023/1024,1024 × 37 与 1023 模 101 同余。

对于第三组数据,答案为 99/128。

数据范围

对于 10% 的评测用例,x, y, a1 ,··· , ak ≤ 10。

对于 20% 的评测用例,x, y, a1,··· , ak ≤ 100。

对于 50% 的评测用例,x, y, a1 ,··· , ak ≤ 1000。

另有 10% 的评测用例,p = 3。

另有 20% 的评测用例,p ≤ 100。

对于全部评测用例,1 ≤ x, y, a1 ,··· , ak ≤ 109 ,3 ≤ p ≤ 10000 且 p 为质数,0 ≤ k ≤ 10。

查看答案
赣ICP备20007335号-2