鏈接: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

#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; }