1. 程式人生 > 其它 >NOIP 模擬 6 大佬

NOIP 模擬 6 大佬

這道題是一道數學期望,考場上想的是,每相鄰 \(k\) 天之間有 \(k-1\) 天是重合的,所以每兩端之間肯定是有影響的。
結果啪啪打臉

這道題其實不用考慮每兩段之間的影響,因為在上一段的每種排法,在下一段我們都可以通過改變不重合的一個來改變影響

所以,我們只需求出每一段的期望,然後乘上段數 \(n-k+1\) ,而對於每一段的期望,我們可以遞推一下

\(f_i\) 表示 \(k\) 天中最大值為 \(i\) 的概率,那麼 \(f_1\) 就是 \((\frac{1}{m})^k\)\(f_i\) 可以先賦為 \((\frac{i}{m})^k\),這其實是算的最大值 \(\leq i\)

的概率,所以我們需要減去 \(\sum_{j=1}^{i-1}f_j\) ,見到此式,我們可以維護一個字首和,也可以直接暴力修改,畢竟 \(m\) 也沒多大。

\(AC\kern 0.5emCODE:\)

Code
#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
using namespace std;
namespace IO{
    char buf[1<<21],*p1=buf,*p2=buf;
    #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
    inline int read() {
        ri x=0,f=1;char ch=gc();
        while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}
        while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
        return x*f; 
    }
}
using IO::read;
namespace nanfeng{
    #define int long long
    #define cmax(x,y) ((x)>(y)?(x):(y))
    #define cmin(x,y) ((x)>(y)?(y):(x))
    #define FI FILE *IN
    #define FO FILE *OUT
    static const int N=550,MOD=1e9+7;
    inline int fpow(int x,int y) {
        int res=1;
        while(y) {
            if (y&1) res=res*x%MOD;
            x=x*x%MOD;y>>=1;
        }
        return res;
    } 
    int wt[N],f[N],n,m,k,res;
    inline int main() {
        // FI=freopen("nanfeng.in","r",stdin);
        // FO=freopen("nanfeng.out","w",stdout);
        n=read(),m=read(),k=read();
        if (k>n) {puts("0");return 0;}
        for (ri i(1);i<=m;p(i)) wt[i]=read();
        int inv=fpow(fpow(m,k),MOD-2);
        for (ri i(1);i<=m;p(i)) {
            f[i]=fpow(i,k)*inv%MOD;
            for (ri j(i-1);j;--j) f[i]=(f[i]-f[j]+MOD)%MOD;
        }
        for (ri i(1);i<=m;p(i)) res=(res+wt[i]*f[i])%MOD;
        printf("%lld\n",res*(n-k+1)%MOD); 
        return 0;
    }
    #undef int
}
int main() {return nanfeng::main();}