题面: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; }