NOIP 模擬 6 大佬
阿新 • • 發佈:2021-06-11
這道題是一道數學期望,考場上想的是,每相鄰 \(k\) 天之間有 \(k-1\) 天是重合的,所以每兩端之間肯定是有影響的。
結果啪啪打臉
這道題其實不用考慮每兩段之間的影響,因為在上一段的每種排法,在下一段我們都可以通過改變不重合的一個來改變影響
所以,我們只需求出每一段的期望,然後乘上段數 \(n-k+1\) ,而對於每一段的期望,我們可以遞推一下
設 \(f_i\) 表示 \(k\) 天中最大值為 \(i\) 的概率,那麼 \(f_1\) 就是 \((\frac{1}{m})^k\),\(f_i\) 可以先賦為 \((\frac{i}{m})^k\),這其實是算的最大值 \(\leq i\)
\(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();}