题目:https://vjudge.net/contest/425090#problem/B
题意:摇色子游戏,色子有s面,每一面的数分别是1-s,在y回合里面是否至少有x回合摇出来的数大于等于r,如果是的话,那我赢w块钱,否则输一块钱,问:我是否能赢钱,能的话出去yes,否则输出no。
题解:算出我总共赢的概率,然后乘以w,这是期望,然后看一下是否比1大就行。
算总共赢的概率:首先y回合总共有pow(s,y)中方案,那么算出我能赢的方案数,比一下就行。
算我赢的方案数:首先枚举我从赢x-y局,然后C(y,x)是我赢在y回合中赢x回合的方案数,然后再乘以我每一回合赢的时候有几种赢法就行了。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+7;
const ll inf=(1ll<<32)-1;
const ll mod=1e9+7;
ll ma[12][12];
void get_zuhe() //求组合数
{
ma[0][0]=1;
for(int i=1; i<=11; i++)
{
ma[i][0]=ma[i][i]=1;
for(int j=1; j<i; j++)
ma[i][j]=ma[i-1][j]+ma[i-1][j-1];
}
}
ll qpow(ll a,ll k)//快速幂
{
ll ans=1;
while(k)
{
if(k&1)ans=(ll)ans*a;
a=(ll)a*a;
k=k/2;
}
return ans;
}
int main()
{
get_zuhe();
int T;
scanf("%d",&T);
while(T--)
{
ll r,s,x,y,w;
scanf("%lld%lld%lld%lld%lld",&r,&s,&x,&y,&w);
int a=s-r+1; //我有几种赢法
int b=r-1;
ll down=qpow(s,y);
double p=0;
for(int i=x; i<=y; i++)
{ //ma是y回合里赢i回合的方案书,俩qpow是我每一回合里面
//赢的方法的数量
p+=1.0*ma[y][i]*qpow(a,i)*qpow(b,y-i)/down;
}
p=1.0*p*w; //看是否比1大
if(p>1)puts("yes");
else puts("no");
}
return 0;
}