Lust 题解

CF446E

很好的一道 EGF 入门题。


我们发现每一操作一次,答案增加多少,ai 就减小多少。

于是答案即为 ai(aibi),其中 bi 为在 i 位子上操作的次数。

显然我们只需算出后面这坨的期望就行了,前面是固定的。

期望是困难的,先化为普通式子。

E[(aibi)]=1nkbi=kk!bi!(aibi)=k!nkbi=kaibibi!

注意求和的那坨式子,看到 bi=k 在条件上就想 嗯,生成函数。

说来就来,写出 :

F^(x)=i=0(bj=iajbjbj!)xi

再把求和后面那一坨拎出来:

G^i(x)=j=0aijj!xj=aij!xj1(j1)!xj=aiexx1(j1)!xj1=(aix)ex

发现 F^ 就是 G^ 的加法和卷积,所以:

F^(x)=G^i(x)=(aix)ex=enx(aix)=[(aix)]xinii!

左边这个求积的各项系数显然可以求出(方法放在后面),设其为 H(x)=hixi

所以答案即为:

E(ans)=aik!nk[xk]F^(x)=aihinki(ki)!=aihik!(ki)!ni

这里就做完了。


现在我们回过头来想怎么求出 hi

我们想的是 i=0n(aix) 的系数,但是我们可以从 i=0n1(aix) 的系数推出,只需要给每个位置项都乘上 (anx) 再更新到系数上就行了。

以此类推,只要从 n=0 的情况不断递推即可。

代码还是相当好写的。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
#define per(i, a, b) for (int i = (a); i >= (b); i--)
constexpr int MAXN = 5005;
constexpr int MOD = 1e9 + 7;
int qpow(int x, int y) {
    int ans = 1;
    while (y) {
        if (y & 1)
            ans = ans * x % MOD;
        x = x * x % MOD;
        y >>= 1;
    }
    return ans;
}
int a, n, k, c[MAXN];
signed main() {
    cin >> n >> k;
    c[0] = 1;
    rep (i, 1, n) {
        cin >> a;
        per (j, i, 1) {
            c[j] *= a;
            c[j] -= c[j - 1];
            c[j] = (c[j] + MOD) % MOD;
        }
        (c[0] *= a) %= MOD;
    }
    int ans = c[0], pw = 1;
    rep (i, 0, n) {
        (ans += MOD - pw * c[i] % MOD) %= MOD;
        (pw *= (k - i) * qpow(n, MOD - 2) % MOD) %= MOD;
    }
    cout << ans << endl;
    return 0;
}
posted @   LightningCreeper  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示