牛客 小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 }

浙公网安备 33010602011771号