1. 程式人生 > 其它 >CF453A Little Pony and Expected Maximum 數學題

CF453A Little Pony and Expected Maximum 數學題

CF453A Little Pony and Expected Maximum 數學題

連結

這個題比較水。連我都能做出來

這個題我們直接考慮最大值為 \(k\) 時的概率是多少。

我們設 \(p_k\) 為最大值為 \(k\) 時的概率。令 \(f_k\) 表示 \(m\)\(k\) 的所有值一個也沒有出現的概率。

如果最大值為 \(k\) ,那麼說明比 \(k\) 大的數一個也沒有出現,而 \(k\) 至少出現一次。

也就是說,\(f_{k+1}\) 這個概率裡包含兩個部分,其中一個部分是 \(f_k\) ,也就是 \(k\) 沒有出現,另一個部分是 \(k\) 至少出現一次。也就是說 \(f_{k+1}-f_{k}\)

就是 \(k\) 為最大值的概率。

我們用快速冪一算就可以。

程式碼:

#include<bits/stdc++.h>
#define dd double
#define ld long double
#define ll long long
#define uint unsigned int
#define ull unsigned long long
#define N 100010
#define M number
using namespace std;

const int INF=0x3f3f3f3f;

template<typename T> inline void read(T &x) {
    x=0; int f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c == '-') f=-f;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    x*=f;
}

int m,n;
dd p[N],ans;

inline dd ksm(dd a,int b){
    dd res=1.0;
    while(b){
        if(b&1) res*=a;
        a=a*a;
        b>>=1;
    }
    return res;
}

int main(){
    read(m);read(n);
    p[m+1]=1;
    for(int i=m;i>=1;i--){
        p[i]=ksm((dd)(i-1)/(dd)m,n);
        ans+=(p[i+1]-p[i])*i;
    }
    printf("%lf\n",ans);
    return 0;
}