题目:
小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富。已知购买一张彩票需要3元,而彩票中奖的金额分别为1,2,3,4元,并且比较独特的是这个彩票中奖的各种金额都是等可能的。现在小A连续购买了n张彩票,他希望你能够告诉他至少能够不亏本的概率是多少。
输出一个最简分数a/b,表示小A不亏本的概率。
若概率为1,则输出1/1,概率为0,则输出0/1。
0≤n≤30
做法:
n这么小。直接枚举所有情况。
定义状态(i,j,k,l)表示金额分别为1、2、3、4元的彩票分别有i、j、k、l张。
直接3重循环枚举状态。然后看一下亏不亏本。不亏则加上这种状态的出现次数:。然后所有情况数
。答案就是约过的
。
代码:
#include <bits/stdc++.h>
#define lson (rt<<1)
#define rson (rt<<1|1)
#define debug(a) cout << #a ": " << a << endl
#define IOS ios::sync_with_stdio(false), cin.tie(0)
using namespace std;
typedef long long ll;
const int N = 50;
ll c[N][N];
void init(int n){
c[0][0] = 1;
for (int i = 1; i <= n; ++i){
c[i][0] = 1;
for (int j = 1; j <= i; ++j){
c[i][j] = c[i-1][j]+c[i-1][j-1];
}
}
}
int main(void){
IOS;
int n; cin >> n;
init(n);
ll fz = 0, fm = 1;
for (int i = 1; i <= n; ++i) fm *= 4;
for (int i = 0; i <= n; ++i){
for (int j = 0; i+j <= n; ++j){
for (int k = 0; i+j+k <= n; ++k){
int l = n-i-j-k;
if (3*n <= 1*i+2*j+3*k+4*l){
fz += c[n][i]*c[n-i][j]*c[n-i-j][k];
}
}
}
}
ll g = __gcd(fz, fm);
fz /= g, fm /= g;
cout << fz << '/' << fm << endl;
return 0;
}
京公网安备 11010502036488号