Description
X X 分别会出次石头剪刀布,每次随机出, Y Y 会出次石头剪刀布,而 Y Y 知道值也知道 X X 随机出,赢一次得一分,输一次减一分,问后手得分期望最大值
Input
第一行一整数表示用例组数,每组用例输入六个整数 A,B,C,a,b,c A , B , C , a , b , c
(1≤T≤104,0≤A,B,C,a,b,c≤109,A+B+C=a+b+c>0) ( 1 ≤ T ≤ 10 4 , 0 ≤ A , B , C , a , b , c ≤ 10 9 , A + B + C = a + b + c > 0 )
Output
输出后手得分期望最大值,以最简分数形式输出
Sample Input
4
2 0 0
0 2 0
1 1 1
1 1 1
1 0 0
0 0 1
123 456 789
100 200 1068
Sample Output
2
0
-1
3552/19
Solution
Y Y 出剪刀得分的期望为,其余同理,故 Y Y 随机出的得分期望为,用数学归纳法证明这是最大值,令 F(n,A,B,a,b) F ( n , A , B , a , b ) 表示 X X 有个剪刀石头布, Y Y 有个剪刀石头布, Y Y 得分期望最大值
时显然成立,假设对于
1
1
~时均成立,假设
Y
Y
在次出剪刀,那么后手得分期望为
拆开即与 a(C−B)+b(A−C)+c(B−A)n a ( C − B ) + b ( A − C ) + c ( B − A ) n 相同, Y Y 出石头和布同理,故无论怎么出其得分期望值不变
Code
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
int T,A,B,C,a,b,c;
ll gcd(ll x,ll y)
{
return y?gcd(y,x%y):x;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d%d%d",&A,&B,&C,&a,&b,&c);
ll p=(ll)a*(C-B)+(ll)b*(A-C)+(ll)c*(B-A),q=(ll)A+(ll)B+(ll)C;
ll g=gcd(p<0?-p:p,q);
p/=g,q/=g;
if(!p)printf("0\n");
else if(q==1)printf("%lld\n",p);
else printf("%lld/%lld\n",p,q);
}
return 0;
}