小A买彩票-(组合数)
链接:https://ac.nowcoder.com/acm/contest/549/C
来源:牛客网
题目描述
小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富。已知购买一张彩票需要3元,而彩票中奖的金额分别为1,2,3,4元,并且比较独特的是这个彩票中奖的各种金额都是等可能的。现在小A连续购买了n张彩票,他希望你能够告诉他至少能够不亏本的概率是多少。
输入描述:
一行一个整数N,为小A购买的彩票数量一行一个整数N,为小A购买的彩票数量
输出描述:
输出一个最简分数a/b,表示小A不亏本的概率。若概率为1,则输出1/1,概率为0,则输出0/1。输出一个最简分数a/b,表示小A不亏本的概率。若概率为1,则输出1/1,概率为0,则输出0/1。
示例1
输入
2
输出
3/8
备注:
0≤n≤30
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> #include<math.h> #include<string> #include<queue> #define ll long long #define inf 0x3f3f3f3f using namespace std; ll C[40][40]; ll n,minn,maxx; void init() { memset(C,0,sizeof(C)); for(int i=0;i<=40;i++) C[i][0]=1; for(int i=1;i<=40;i++) for(int j=1;j<=i;j++) C[i][j]=C[i-1][j-1]+C[i-1][j]; } ll gcd(ll a,ll b) { if(b==0) return a; return gcd(b,a%b); } int main() { init(); while(scanf("%lld",&n)!=EOF) { minn=3*n; maxx=4*n; ll ans=0; for(ll k=minn;k<=maxx;k++) { for(ll a=0;a<=n;a++) for(ll b=0;b<=n;b++) for(ll c=0;c<=n;c++) for(ll d=0;d<=n;d++) { if(a+2*b+3*c+4*d==k && a+b+c+d==n) { ans+=C[n][a] * C[n-a][b] * C[n-a-b][c] * C[n-a-b-c][d]; } } } ll sum=1; for(int i=1;i<=n;i++) sum=sum*4; int g=gcd(sum,ans); printf("%lld/%lld\n",ans/g,sum/g); } return 0; }