第一次给大家(跟我一样的小白)写题解,因为我是入门小白(这是真的,不跟很多大佬一样装萌新!!!),望大家指正海涵!
之所以我想写这次的题解是因为,明明好不容易想出来了,却被n=0的情况卡住了,硬是没debug出来,只过了94%的数据,很是遗憾!
我的代码比较呆(冗长且拙劣),专门写给和我一样的小白看的,因为我看大佬题解,会有很多知识盲区或者理解不了的地方,理解了小白的苦,所以我决定为和我一样的小白写一些我会的题的题解,大佬们可以直接忽略,谢谢。
/*
题解:
首先,如果题目不是出在动态规划专题我是真的不知道要dp(知道了也没AC!!!丢人)
思路:
建立dp[i][j]表示经过了i次抽奖,抽奖获得的钱数j(无需减去抽奖所花费的钱)的 概率的分子(这里的概率是没有约分过的,为什么这么说呢,可以看一下转移方程)

这里我们先假设dp[i][j]表示经过了i次抽奖,抽奖获得的钱数j(无需减去抽奖所花费的钱)的概率(不再是分子的概率)   
(假设情况下的)转移方程:
    dp[i][j]=1/4*(dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4])
解释:
    dp[i][j]表示经过了i次抽奖,抽奖获得的钱数j的概率
    1/4*dp[i-1][j-1]表示经过了i-1次抽奖,抽奖获得的钱数j-1的概率的分子(1/4代表第i次抽奖抽到的是1元的概率,dp[i-1][j-1]代表前i-1次抽奖抽到j-1元的概率)
    1/4*dp[i-1][j-2]表示经过了i-1次抽奖,抽奖获得的钱数j-2的概率的分子(1/4代表第i次抽奖抽到的是1元的概率,dp[i-1][j-2]代表前i-1次抽奖抽到j-2元的概率)
    …………
    其实,“经过了i次抽奖,抽奖获得的钱数j的概率”就等于“经过了i次抽奖,抽奖获得的钱数j-1的概率*1/4 + 经过了i次抽奖,抽奖获得的钱数j-2的概率*1/4 + 经过了i次抽奖,抽奖获得的钱数j-3的概率*1/4 + 经过了i次抽奖,抽奖获得的钱数j-4的概率*1/4”

    这样你应该差不多明白了,在我们假设下的转移方程。

    我们要把假设去掉,也就是“dp[i][j]表示经过了i次抽奖,抽奖获得的钱数j(无需减去抽奖所花费的钱)的概率的分子”
    //我们之所以要让dp存分子,是因为题目要求输出分数,我们要分开存储分子和分母才能实现如题的输出
    从假设中的转移方程不难发现,每次都要乘以1/4;通过手写计算可以知道,(假设下的)dp[1][1]=1/4,dp[1][2]=1/4,dp[1][3]=1/4,dp[1][4]=1/4,其他的dp[1][i]=0。类推一下,已知n=1时,分母为4,那么n=2时,分母为4^2,…… ,ok,分母的问题解决了,注意这里的分母时未约分的分母。
    看一下分子,也就是dp数组。
    如果用假设下的dp数组,手写几组数据你会发现,如果概率没有进行约分,单看分子,正是前一种情况,转移方程中dp的分子的和,类比到非假设情况的dp数组中,dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4](先不管分母,分母另求就行),与假设下的转移方程相比没多少变化,就是把1/4拿去当分母了。
    那么ok了,你已经理解如何思考了,接下来同样困难的就是代码的实现,因为有时候虽然你能想出来算法,但是你并不能写出完整的代码。
    代码的解释在代码中写了        

*/

include<bits/stdc++.h>

//万能开头,毛巨(未来的acm金牌,hhhh)告诉我的
#define ll long long
//要开long long,因为看分母的话最大是4^30=2^60,ll范围是2^64-1
using namespace std;
ll dp[50][150];
//dp[i][j]表示经过了i次抽奖,抽奖获得的钱数j(无需减去抽奖所花费的钱)的概率(不再是分子的概率)
int main(){

    int n;
    cin>>n;

if(n==0){//其实不存在概率为0的情况,我们直接忽略输出“0/1”。输出“1/1”只在n=0的时候会出现,出现,直接输出,结束程序
    cout<<"1/1";
    return 0;
}

for(int j=1;j<=4;j++)
    dp[1][j]=1;
    //初始化一下,一会直接从n=2的时候开始dp就行了
    //等价于dp[1][1]=dp[1][2]=dp[1][3]=dp[1][4]=1;
for(int i=2;i<=n;i++)//注意从n=2开始
    for(int j=i;j<=4*i;j++)
            //为什么从j=i开始?经过了i次抽奖,最少抽奖获得i元啊,获得钱数小于i的概率(分子)都是0。
            //为什么j=4*i结束?就算每次抽奖都抽到4元,最多获得4*i元啊,获得钱数大于4*i的概率(分子)都是0。
        dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+(j>=3?dp[i-1][j-3]:0)+(j>=4?dp[i-1][j-4]:0);//转移
ll z=0;//z是分子fenzi的简写
for(int i=3*n;i<=4*n;i++)
   //只有抽奖获取钱数是n的三倍到四倍之间的时候才是不亏的时候
    z+=dp[n][i];//把不亏的情况的分子加起来

ll m=pow(4,n);    //m是分母fenmu的简写
ll g=__gcd(z,m);//百度的求最大公约数的函数,你也可以递归或者循环实现,我偷懒了
cout<<z/g<<'/'<<m/g;//输出约分后的        

}
//以下均属哔哔赖赖,可忽略!
哦终于写完题解了,好累,知道大佬们写题解有多辛苦了,希望大家珍惜他们的劳动成果,还有就是感谢大家的浏览,欢迎大家的指正,(自己写题解就瞎胡说两句就拉倒了,真的没想到写个完整的这么累!!!)
对了,非常抱歉,不明白这个排版是什么情况,我在写题解的这边自己排的挺不错的,到了右边直接爆炸,非常抱歉,我再研究研究怎么用。