不注意な
所与\(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);
}