生活随笔
收集整理的這篇文章主要介紹了
ZOJ 3380 Patchouli's Spell Cards(DP,大数)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)載請(qǐng)注明出處,謝謝http://blog.csdn.net/acm_cxlove/article/details/7854526?????? by---cxlove
題目:有m個(gè)位置,每個(gè)位置填入一個(gè)數(shù),數(shù)的范圍為1-n,問(wèn)至少有i個(gè)位置的數(shù)字一樣的概率為多少
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3957?
完全就是仿造zeroclock的做法的。。。主要是練習(xí)JAVA
至少有i個(gè)位置一樣,也就是i+1,i+2,……m個(gè)位置一樣,不好處理
我們知道總的方案數(shù),n^m也就是分母
可以dp處理有沒(méi)有i個(gè)位置的數(shù)字一樣的概率
dp[i][j]表示當(dāng)前已經(jīng)放了j個(gè)位置,用到了第i種顏色
即dp[i][j]=dp[i-1][j-k]*C(m-(j-k),k) ? ?(k<=j&&k<l) 表示我們找出k個(gè)位置填入數(shù)字i
因?yàn)槿绻鹟>m則必然是無(wú)解的,l>m/2可以直接用組合計(jì)數(shù)算出,時(shí)間減少一半
數(shù)字很大,也沒(méi)有取模,需要大數(shù)處理
import java.util.*;
import java.math.*;
public class Main
{static BigInteger[][] dp=new BigInteger[105][105];static BigInteger[][] c=new BigInteger[105][105];public static void main(String[] args){Scanner cin = new Scanner(System.in);for(int i=0;i<105;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 m,n,l;while(cin.hasNext()){m=cin.nextInt();n=cin.nextInt();l=cin.nextInt();BigInteger total=BigInteger.valueOf(n).pow(m);if(l>m){System.out.println("mukyu~");continue;}if(l>m/2){ BigInteger ans = BigInteger.ZERO; for (int i = l; i <= m; ++i) ans = ans.add(c[m][i].multiply(BigInteger.valueOf(n-1).pow(m-i))); ans = ans.multiply(BigInteger.valueOf(n)); BigInteger gcd = ans.gcd(total); System.out.println(ans.divide(gcd)+"/"+total.divide(gcd)); 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++){for(int k=0;k<l&&k<=j;k++){dp[i][j]=dp[i][j].add(dp[i-1][j-k].multiply(c[m-(j-k)][k]));}}}BigInteger ans=new BigInteger("0");for(int i=1;i<=n;i++){ans=ans.add(dp[i][m]);}ans=total.subtract(ans);BigInteger gcd=ans.gcd(total);System.out.println(ans.divide(gcd)+"/" + total.divide(gcd));}}
}
總結(jié)
以上是生活随笔為你收集整理的ZOJ 3380 Patchouli's Spell Cards(DP,大数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。