小A买彩票

题面:https://ac.nowcoder.com/acm/contest/549/C

方程就是f[i][k]=f[i-1][k-j],其中i为彩票张数,k为钱的总数,j=1,2,3,4;

即从上一层的状态推出下一层的状态;

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int maxn=35;
int n;
long long ans,sum,f[maxn][4*maxn];
long long gcd(long long a,long long b);
long long p(int x,int m);
int main()
{
    cin>>n;
    f[0][0]=1;
    for(int i=1;i<=n;i++)//彩票的张数
    {
        for(int k=1*i;k<=4*i;k++)//i张彩票的最小值和最大值
        {
            for(int j=1;j<=4;j++)
            {
                if(k-j>=0) f[i][k]+=f[i-1][k-j];
            }
        }
    }
    for(int i=3*n;i<=4*n;i++) ans+=f[n][i];//统计符合的方法数
    sum=p(4,n);//统计总方法数
    printf("%lld/%lld",ans/gcd(ans,sum),sum/gcd(ans,sum));
    return 0;
}
long long gcd(long long a,long long b)
{
    return b==0?a:gcd(b,a%b);
}
long long p(int x,int m)
{
    int k=x;
    for(int i=1;i<m;i++)
        x*=k;
    return x;
}

猜你喜欢

转载自www.cnblogs.com/zufe180110910719/p/10700491.html