题意:
四种彩票中奖金额分别为1,2,3,4,且各种金额中奖率相等(良心),小A买了n张彩票,问不亏本概率为多少?
分析:
模拟几次n发现,n每个中奖金额出现的概率总是由第n-1的概率转移过来的,具体转移方式有4种1,2,3,4,统计可行方式相加即可。因此我们可以用dp进行解决。
设dp[i][j]:前i张彩票中奖为j元的方案数。
转移方程:dp[i][j] += dp[i-1][j-k] 其中1≤k≤4 k≤j
初始dp[0][0]等于1
买n张彩票共有4^n方案数cnt
符合题意方案数为:sum(dp[n][j]),3n<=j<=4n
最后答案为sum/cnt(gcd化简)
代码:
#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; typedef long long ll; ll dp[35][150]; ll n,i,j,cnt; int main() { scanf("%lld",&n); dp[0][0]=1; for(i=1;i<=n;i++){ for(j=1;j<=4*i;j++){ if(j>=1) dp[i][j]+=dp[i-1][j-1]; if(j>=2) dp[i][j]+=dp[i-1][j-2]; if(j>=3) dp[i][j]+=dp[i-1][j-3]; if(j>=4) dp[i][j]+=dp[i-1][j-4]; } } ll sum=0; for(j=3*n;j<=4*n;j++){ sum+=dp[n][j];//符合条件的方案数 } cnt=(ll)pow(4,n);//总方案数 while(__gcd(sum,cnt)!=1){ ll t=__gcd(sum,cnt); sum=sum/t; cnt=cnt/t; } printf("%lld/%lld",sum,cnt); }