题意:用3元买一张彩票,等概率获得1,2,3,4元奖品,求买n张不亏本的概率。
思路:dp[j][i]表示买了i张获得的钱,转移方程就是: dp[j][i]=dp[j-1][i-1]+dp[j-2][i-1]+dp[j-3][i-1]+dp[j-4][i-1];
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <stack> #include <queue> #include <cmath> #define ll long long #define pi 3.1415927 #define inf 0x3f3f3f3f #define mod 1000000007 using namespace std; int n,m; ll dp[130][40]; ll gcd(ll j,ll k) { if(!j) return k; return gcd(k%j,j); } int main () { ll T,i,t,j,k,p,sum=0; cin>>n; dp[0][0]=1; for(i=1;i<=n;++i) for(j=1;j<=4*i;++j){ if(j>=1) dp[j][i]+=dp[j-1][i-1]; if(j>=2) dp[j][i]+=dp[j-2][i-1]; if(j>=3) dp[j][i]+=dp[j-3][i-1]; if(j>=4) dp[j][i]+=dp[j-4][i-1]; } p=0; for(j=3*n;j<=120;++j) if(dp[j][n]) p+=dp[j][n]; //for(j=1;j<=10;++j) //cout<<dp[j][n]<<" "; sum=pow(4,n); k=gcd(p,sum); cout<<p/k<<"/"<<sum/k<<endl; return 0; }