ZOJ 3380 Patchouli's Spell Cards (概率dp)

来源:互联网 发布:网络系统威胁 网络传输 编辑:程序博客网 时间:2024/05/22 13:08

题意:有m种元素,每种元素可以配n种phase之一;相同phase的元素可以组成一张spell card,card的等级为元素的种数, 问m种元素随机生成的card有多少概率使他的等级至少为l

 

dp[i][j]为用前i种phase生成i种元素有多少种情况

dp[i][j] = dp[i][j-k] * C[m-j+k][k] ( k >= 0 && k <= j && k < l )

意思是用第i种phase去生成k个元素

则答案为  ( n^m - dp[1~n][m] ) / ( n^m );

 

import java.math.*;import java.io.*;import java.util.*;public class Main  {static BigInteger[][] dp = new BigInteger[111][111];static BigInteger[][] C = new BigInteger[111][111];static public void main ( String [] args ) {Scanner cin = new Scanner( System.in );for( int i = 0;i < 110; i++ ) {C[i][0] = C[i][i] = BigInteger.ONE;for( int j = 1; j < i; ++j ) C[i][j] = C[i-1][j-1].add( C[i-1][j] );}int n, m, l;while( cin.hasNext() ) {m = cin.nextInt();n = cin.nextInt();l = cin.nextInt();if ( l > m ) {System.out.println( "mukyu~");continue;}for( int i = 0; i <= n; ++i )for( int j = 0; j <= m; ++j )dp[i][j] = BigInteger.ZERO;dp[0][0] = BigInteger.ONE;for( int i = 1; i <= n; ++i ) for( int j = 1; j <= m; ++j ) {dp[i][j] = dp[i][j].add( dp[i-1][j] );for( int k = 1; k <= j && k < l; ++k ) dp[i][j] = dp[i][j].add( dp[i-1][j-k].multiply( C[m-j+k][k]) );}BigInteger ans = BigInteger.ZERO;for( int i = 1; i <= n; ++i ) ans = ans.add( dp[i][m] );//System.out.println( ans );BigInteger tot = BigInteger.valueOf( n ).pow( m );ans = tot.subtract( ans );BigInteger tmp = ans.gcd( tot );System.out.println( ans.divide( tmp ) +"/" + tot.divide( tmp ) );}}}

0 0
原创粉丝点击