LightOJ-1064-dp

来源:互联网 发布:vb winsock 编辑:程序博客网 时间:2024/05/17 06:53

题目大意:抛一个质地均匀的筛子n次,问最后总得分至少为x的概率是多少;

题目解析:定义dp[i][j]表示抛了i次,总得分为j的次数,枚举时dp[i][j]+=dp[i-1][j-k];接下来算一下gcd就ok了;

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>using namespace std;typedef long long ll;ll cnt[160],dp[26][160];ll gcd(ll a,ll b){if(b==0)return a;return gcd(b,a%b);}ll pow(int t){ll ans=1;int i; for(i=1;i<=t;i++)ans*=6;return ans;} int main(){int cas,c,i,j,k,n,x;scanf("%d",&cas);for(c=1;c<=cas;c++){scanf("%d%d",&n,&x);memset(dp,0,sizeof(dp));for(i=1;i<=6;i++)dp[1][i]=1;for(i=2;i<=n;i++){for(j=2;j<=(6*i>x?x:6*i);j++){for(k=1;k<=6;k++)if(j-k>=i-1)dp[i][j]+=dp[i-1][j-k];}}ll ans=0;for(i=n;i<x;i++)ans+=dp[n][i];ll m=pow(n);ll g=gcd(m,m-ans);if(ans==0){printf("Case %d: 1\n",c);continue;}if(ans==m){printf("Case %d: 0\n",c);continue;}printf("Case %d: %lld/%lld\n",c,(m-ans)/g,m/g);}return 0;} 



0 0