• lightoj 1064 Throwing Dice


      题意:给你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;
    }
  • 相关阅读:
    sql优化
    mysql_存储过程_后一行减去前一行
    python基础笔记
    atom使用markdown
    tensorboard遇到的坑
    WordPaster-Firefox浏览器控件安装方法
    WordPaster.exe安装教程
    Web大文件上传控件-bug修复-Xproer.HttpUploader6
    Web大文件下载控件更新-Xproer.HttpDownloader
    Web大文件上传控件-asp.net-bug修复-Xproer.HttpUploader6.2
  • 原文地址:https://www.cnblogs.com/yongren1zu/p/3250069.html
Copyright © 2020-2023  润新知