UVA10759 - Dice Throwing(dp+gcd)

UVA10759 - Dice Throwing(dp+gcd)

题目链接

题目大意:n个色子,求n个色子之和不小于x的概率。

解题思路:因为可以将题目转化成求n个色子和小于x的数目,最后再6^n减去就这个数目就是大于等于x的数目了。因为n最大就24,这样还是可以用long long来存放,最后输出要求的是分数形式,将分子分母用gcd约分一下输出即可。

代码:

#include <cstdio>
#include <cstring>

typedef long long ll;
const int maxn = 25;
const int maxm = 155;

int N, X;
ll f[maxn][maxm], t[maxn];

void init () {

    t[0] = 1LL;
    for (int i = 1; i < maxn; i++)
        t[i] = t[i - 1] * 6;
}

ll gcd (ll a, ll b) {
    return b == 0? a: gcd(b, a%b);
}

ll dp (int n, int x) {

    ll& ans = f[n][x];
    if (ans != -1)
        return ans;
    if (n == N) {
        if (x < X)
            return ans = 1;
        return ans = 0;
    }

    ans = 0;
    for (int i = 1; i <= 6; i++)
        if (x + i < X)
            ans += dp(n + 1, x + i);
        else
            break;
    return ans;
}

int main () {

    init();
    while (scanf ("%d%d", &N, &X) && (N||X)) {

        memset(f, -1, sizeof (f));
        ll a = t[N] - dp(0, 0);

        if (a == 0) {
            printf ("0\n");
            continue;
        }

        if (a == t[N]) {
            printf ("1\n");
            continue;
        }

        ll tmp = gcd(a, t[N]);
        printf ("%lld/%lld\n", a/tmp, t[N]/tmp);

    }
}
时间: 2024-11-05 02:29:04

UVA10759 - Dice Throwing(dp+gcd)的相关文章

UVA 10497 - Sweet Child Makes Trouble(DP+高精度)

题目链接:10497 - Sweet Child Makes Trouble 题意:n个物品,原来物品属于一个地方,现在要把物品重新放回去,问能放几种使得每个物品都与原来位置不同 思路:递推,一开始随便搞了个二维状态,dp[i][j]表示i个物品,有j个位置不同,那么dp[n][n]就是答案,递推式为: dp[i][j] = 1 (j == 0) dp[i][j] = (j - 1) * dp[i - 1][j - 1] + dp[i - 1][j] + (i - j + 1) * dp[i -

UVA 10641 - Barisal Stadium(DP + 几何)

题目链接:10641 - Barisal Stadium 题意:逆时针给定n个点,在给m个灯,每个灯有一个花费,要求最小花费使得所有边能被灯照到 思路:用向量叉积判断向量的顺逆时针关系,从而预处理出每个灯能照到的边,然后由于n个点是环的,所以可以直接扩大两倍,dp时候去枚举起点即可 状态为dp[i]表示现在照到i条边之前的边全部照亮需要的最小花费 代码: #include <stdio.h> #include <string.h> const double eps = 1e-6;

HDU 2577 How to Type(dp题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577 解题报告:有一个长度在100以内的字符串,并且这个字符串只有大写和小写字母组成,现在要把这些字符串用键盘输入到电脑中,一开始的时候大写锁定是关闭的,并且要求结束的时候也是关闭的,然后让你求输入这些字符串最少需要按多少次键盘(包括Cap Lock键和Shift键) 一个典型的dp题,定义一个一维数组就够了,然后dp[i]的含义的输入到第i个字符时需要按键的最少次数.然后递推公式如下: dp[i]

hdu 4945 2048 (dp+组合数)

2048 Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 840    Accepted Submission(s): 199 Problem Description Teacher Mai is addicted to game 2048. But finally he finds it's too hard to get 2048.

ZOJ 3631 Watashi&#39;s BG(dp+dfs)

题意:一共要吃n顿饭 公款m元 如果公款大于等于饭局所需费用 就全用公款 如果小于就自费 求最后能用的公款为多少 思路: dfs(i - 1, val + dp[i]); dfs(i - 1, val); #include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; int dp[50]; int n, m; int a

HDU 2104 hide handkerchief(辗转相除法--GCD)

hide handkerchief Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4693 Accepted Submission(s): 1547 Problem Description The Children's Day has passed for some days .Has you remembered something h

UVA 1543 - Telescope(dp+几何)

题目链接:1543 - Telescope 题意:按顺序给定圆周上一些点,问用选一些点组成m边形面积的最大值. 思路:dp,dp[i][j][k] 表示第一个点为i,最后一个点为j,当前选择k的最大值,因为多选一个点,会多的面积为他和第一个点和最后一个点构成的三角形面积,然后利用海伦公式求面积,状态转移为:dp[i][j][x] = max(dp[i][j][x], dp[i - 1][j][k] + s); 代码: #include <stdio.h> #include <string

hdu 1025 Constructing Roads In JGShining&#39;s Kingdom(DP + 二分)

此博客为转发 Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which are located in t

HDU 1058 Humble Numbers(DP,数)

题意  所有只能被2,3,5,7这4个素数整除的数称为Humble Number  输入n  输出第n个Humble Number 1是第一个humble number  对于一个Humble Number  a  有2*a,3*a,5*a,7*a都是Humble Number  可以以1为基数  依次展开即可得到一定范围内的Humble Number 用i,j,k,l分别记录 2,3,5,7分别乘到了第几个Humble Number  当前在计算第cnt个Humble Number  那么有