CF1278Fカード

CF1278Fカード

重量が1である一方、確率はライセンスが$ P(I)= \ FRAC 1メートル$、$ \ FRAC {1} M $は、get $ N $倍ブランドの寄与が独立していることが予想され得ればまず、我々は、それを知っていますこれは、$ \ FRAC NM $です。

しかし、我々は$ K $の期待の乗であるにカウントする必要があり、よく知られている二次の期待は二次予想に一致しません。私たちは、$ E $の重要性を考慮し、$ E $ジョーカーは、そうでない場合は0であり、$ \ FRAC 1メートル$低い確率1であるこの時期に入りました。そして、$ E ^ 2 $がランダム倍である、ケース1で両方の時間はそれ以外の場合は0で、1です。

ジョーカー0/1列として書かれたキャッチた場合、我々は最終的に統計的な答えは、長さ$の注文した配列の全てが$ A_3、A_2、A_2 $このことができる$を(Kということである知っているように、我々は、$ N $回を置きますそれはすべてのすべて、この確率変数系列に寄与しているものとする種)は、1に行ってきました。

位置番号の同じ種類の2つの配列が、その確率は、彼らが同じように表示されていることならば、検討してください。あなたはこれらの位置はジョーカーを知っている場合、すべての配列からなるこれらの場所が表示されます。

だから、DPを考え、$ DPは、[I] [ j]は$がこの位置に到達したときに、私は$、$ J $が持つ異なる位置が登場し、第1の位置$の現在の選択を表します。その後、$ \和DP [K] [ I] \回\ FRAC {1} {M ^ {I}} $が答えである、$ \ FRAC {1} {Mため ^ I} $の確率$ I $番目そのインペリアル要素の位置はジョーカーですので、右の価値をもたらすことはプログラムの数です。そして、非常に簡単である再発DPを、考える:
\ [DP [I] [J] = DP [I-1]〜[J] \タイムズJ + DP [I-1]〜[J-1] \タイムズ(N-J + 1)\
] 前の1か、新しい$ jを選択を選択するために、$ I $ $の位置を考慮することです。

コードは簡単です:

#include "algorithm"
#include "iostream"
#include "cstring"
#include "cstdio"
using namespace std;
#define MAXN 5006
#define P 998244353
int n , m , k;
int dp[MAXN][MAXN];
int Pow( int a , int b ) {
    int cur = a % P , ans = 1;
    while( b ) {
        if( b & 1 ) ans = 1ll * ans * cur % P;
        cur = 1ll * cur * cur % P , b >>= 1;
    }
    return ans;
}
int main( ) {
    cin >> n >> m >> k;
    dp[0][0] = 1;
    for( int i = 1 ; i <= k ; ++ i ) {
        for (int j = 1; j <= i; ++j)
            dp[i][j] = ( 1ll * dp[i-1][j] * j % P + 1ll * dp[i-1][j-1] * ( n - j + 1 ) % P ) % P;
    }
    int res = 0 , cur = 1 , p = Pow( m , P - 2 );
    for( int i = 0 ; i <= k ; ++ i )
        ( res += 1ll * dp[k][i] * cur % P ) %= P , cur = 1ll * cur * p % P;
    cout << res << endl;
}

おすすめ

転載: www.cnblogs.com/yijan/p/12330712.html