题意:给你n个骰子,求n个骰子的和不小于x的概率。
刚开始想每给一组数就计算一次~~太笨了- -,看了别人的代码,用dp,而且是一次就初始化完成,每次取对应的数据就行了。WA了好多次啊,首先不明白的就是:
for(int i=1;i<=25;i++) for(int j=i*6;j>=0;j--) dp[i][j]+=dp[i][j+1];
这段代码不清楚干什么用的,想清楚没?
刚开始求的dp[i][j]表示的是前 i 个骰子掷出总和为 j 的概率 ,题意让求总和不小于 j 的概率,所以把大于 j 的要加上。
然后输出的又WA了好几次~~
有概率为0和1的情况,就不能输出分数形式。
#include<stdio.h> #include<string.h> #define N 30 #define LL long long LL dp[N][N*6],p[N]; void Init() { memset(dp,0,sizeof(dp)); p[0]=1; for(int i=1;i<=25;i++) p[i]=p[i-1]*6; for(int i=1;i<=6;i++) dp[1][i]=1; for(int i=2;i<=25;i++) for(int j=i;j<=i*6;j++) for(int k=1;k<=6;k++) if((j-k)>=i-1) dp[i][j]+=dp[i-1][j-k]; for(int i=1;i<=25;i++) for(int j=i*6;j>=0;j--) dp[i][j]+=dp[i][j+1]; } LL Gcd(LL a,LL b) { return b?Gcd(b,a%b):a; } int main() { Init(); int T,cas=1; int n,x; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&x); LL a=p[n]; LL b=dp[n][x]; LL yu = Gcd(a,b); if(a/yu==1) printf("Case %d: %lld ",cas++,b/yu); else printf("Case %d: %lld/%lld ",cas++,b/yu,a/yu); } return 0; }