[CF457D]ビンゴ!(数学的期待値)

トピックリンク

不注意な

所与\(N、M、K \)を表し、\(N * N \)ヌル行列、\(M \)異なる番号を。
ランダム\(M \)の数\(N ^ 2 \)空行列に投入数(\(M \ GE N ^ 2 \)
とから\(M \)で乱数オプションの\(K \)これらのマトリックス中に異なる数\(K \)マークの数(もしあれば)。
設定\(T \)完全に標識された整列行全体の数の値。
探している\(2 ^ T \)期待と\(1e99 \)より小さい値を。

考え

まず、\(2 ^ T \)など奇妙なことに、我々は例すべてのサブセットの数として理解することができます。
いくつかのケースではそれはかつて合法である以上を数え、そうではないと除外を行うことがあります。
答えは、すべてのことです\(T \)数の期待値の値が表示されます。

そして、より多くの明白なアイデアがあります:何を列挙したい\(R、C \)は、を表し、少なくともそこ(R \)\、行全体を\(C \)カラム全体が完全にマークされています。
この時点で存在する\(C(N、R)時間C(N、C)は\ \) でケースを表し\(T \)値の合計数。
そのようなプログラムの発生確率\(P [R] [C ] \) はこのような状況であるケースの総数で割った値。
我々は仮定することができる\(Z =(C + R&LT)\タイムズNR \タイムズC \) すなわち、\(Z \)数で選択されるであろう\(K \)の数。
そこ:
\ [P [R&LT] [C] = \ FRAC {C(M、K)\ CDOT A(K、Z)\ CDOT A(MZ、N ^ 2-Z)} {C(M、K) \ CDOT A(M、N ^
2)} \] 与えるために簡略化発現後:
\ [P [R&LT] [C] = \ {C FRAC(MZ、KZ)} {C(M、K)} \]

つまり、答の場合への寄与である(C(N、R)を\ \ \ FRAC {C(MZ、KZ)} {C(M、K)}倍\倍C(N、C)\)

小さな注:
について\(P [R] [Cが 】\) と理解されます。

  • 第一方程式理解のために
    分子:列挙\(K \) 選択\(Z \)選択された色、残りの\(N ^ 2-Z \ ) 選択された色の。
    分母:それぞれの場合、すべてのカラーマトリクス検討\(K \)プログラムの選択の総数を。
  • 第二の式を理解するため:プレコート色は統計への答えには影響見つからない
    分子:\(Z \)に固定された位置や色数を、この\(Z \)数でなければなりませんK \(\ )番号、残り\(KZ \)ライン上のランダムな選択。
    分母:Shanghaoカラー行列が持つ、番組のその後総数のみ\(C(M、K) \)

答えはセーブモードの場合:
使用long double回数格納するlog()値を、
乗算は加算となり、引き算は分裂し、最終的に均一な溶液となります。

コード

#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
#define LD long double
const int MAXN=100005;
int N,M,K;
LD f[MAXN],Ans;
LD C(int x,int y){
    return f[x]-f[y]-f[x-y];
}
int main(){
    scanf("%d%d%d",&N,&M,&K);
    for(int i=1;i<=1e5;i++)
        f[i]=f[i-1]+log(1.0*i);
    for(int i=0;i<=N;i++)
        for(int j=0;j<=N;j++){
            int z=N*(i+j)-i*j;
            if(z>K)continue;
            LD tmp=C(N,i)+C(N,j)+C(M-z,K-z)-C(M,K);
            Ans=min((LD)(1e99),Ans+exp(tmp));
        }
    printf("%.10f\n",(double)Ans);
}

おすすめ

転載: www.cnblogs.com/ftotl/p/11774330.html