题意:略
题记:
dp[i][j]表示前i张彩票能组成总金额为j元的方案数
第i张彩票有1,2,3,4元四种选择,所以总金额为j的情况可以由四种情况转移过来。
dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4];
总方案数是4的n次方种,所有方案数中总金额大于等于3*n的就是不亏本的,将数量记录下来,最后将两个数约分之后输出即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200;
ll dp[N][N];
//dp[i][j]表示前i张彩票能组成总金额为j元的方案数
ll qpow(ll a,ll b){//快速幂
ll sum=1;
while(b){
if(b&1)sum=sum*a;
b>>=1;
a=a*a;
}
return sum;
}
ll gcd(ll a,ll b){
while(b){
ll t=a%b;
a=b;
b=t;
}
return a;
}
int main(){
ll n;
cin>>n;
//dp[1][1]=dp[1][2]=dp[1][3]=dp[1][4]=1;
dp[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=i;j<=i*4;j++)
dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4];
ll ans=0;
ll sum=qpow(4,n);//总方案数
for(int i=3*n;i<=4*n;i++)
ans+=dp[n][i];
ll g=gcd(ans,sum);//求出最大公因子
cout<<ans/g<<'/'<<sum/g<<endl;
return 0;
}

京公网安备 11010502036488号