ZOJ 3380 Patchouli's Spell Cards 概率DP

来源:互联网 发布:linux 中文时间格式 编辑:程序博客网 时间:2024/05/22 11:51

题意:给你m个位置,每个位置放一个数,区间为1~n,问你至少有L个位置是一样的数的概率,结果用分数表示

思路:这题我们从反向入手,dp[i][j]代表前i个数,放到j个位置,且没有L个或以上的位置有相同的组合情况,最后用n^m减去即可

这道题要用大数,正好这两天在乱搞python。。。也算是自己用python过的第一道题~

import sysC = [([0] * 110) for i in range(110)]for i in range(101):    C[i][0] = C[i][i] = 1    for j in range(1, i):        C[i][j] = C[i-1][j] + C[i-1][j-1]def GCD(a, b):    return a if not b else GCD(b, a % b)while True:    try:        m, n, l = map(int, sys.stdin.readline().split())        if(l > m):            print('mukyu~')            continue        dp = [([0] * 110) for i in range(110)]        dp[0][0] = 1        for i in range(1, n+1):            for j in range(1, m+1):                for k in range(0, min(j+1, l)):                    dp[i][j] += dp[i-1][j-k] * C[m-(j-k)][k]        Sum = pow(n, m)        ans = 0        for i in range(1, n+1):            ans += dp[i][m]        ans = Sum - ans;        gcd = GCD(ans, Sum)        print str(ans / gcd) + '/' + str(Sum / gcd)    except:        break
0 0
原创粉丝点击