牛客 小A买彩票 ###K ###K //K

题目链接:https://ac.nowcoder.com/acm/problem/23413

思路:求出不亏本的数/总的方案数

考虑用dp来处理计数

要注意的是特判 n=0的情况

用dp[i][j]表示前i张彩票得到了j钱的方案数

当前的钱只能由上一次+1~4得来 那么就

推出dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4]

i=1的时候没有符合 那么单独给他初始化即可

那么最后sum+=dp[n][x](3*n<=x<=4*n)即可

因为每张彩票有4种可能 所以总的方案数是4^n

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define ull unsigned long long
 5 #define pb push_back
 6 const int maxn=5e5+10;
 7 const int mod=1e9+7;
 8 ll dp[50][150];
 9 ll gcd(ll a,ll b)
10 {
11     if(b==0) return a;
12     else return gcd(b,a%b);
13 
14 }
15 
16 
17 int main()
18 {
19     ios::sync_with_stdio(false);
20     cin.tie(0);
21     int n;
22     cin>>n;
23     if(n==0)
24     {
25         cout<<"1/1"<<'\n';
26         return 0;
27     }
28     ll sum=1;
29     for(int i=1;i<=n;i++)
30         sum*=4;
31     for(int i=1;i<=4;i++)
32     {
33         dp[1][i]=1;
34     }
35     for(int i=2;i<=n;i++)
36     {
37         for(int j=i;j<=i*4;j++)
38         {
39             for(int x=1;x<=4;x++)
40             {
41                 if(j-x>=1)
42                 dp[i][j]+=dp[i-1][j-x];
43             }
44         }
45     }
46     ll ans=0;
47     for(int i=n*3;i<=4*n;i++)
48     {
49         ans+=dp[n][i];
50     }
51     int d=gcd(ans,sum);
52     ans/=d;
53     sum/=d;
54     cout<<ans<<"/"<<sum<<'\n';
55 
56 
57 
58 
59 
60 
61 }
View Code

 

posted @ 2020-05-30 11:51  canwinfor  阅读(234)  评论(0)    收藏  举报