:::info[Description] Link. :::
:::infoSolution 记 即 表示还有多少块饼干不在 手里。考虑终止态是什么:显然此时一定是获胜者 其余人均满足 。
同样考虑鞅与停时定理,构造势能函数 。每一次选中一个人 ,则 的变化情况只有三种,分别是不变,增加 和减少 。不变的情况势能不会变化,因此只需要讨论另外两种情况:
减少 :即先选一个不归属 的饼干,然后把这个饼干给 。概率显然就是 。
增加 :即任选一个归属 的饼干即可,概率显然就是 。
同样希望势能函数每次期望减少 ,即 。记势能函数的变化量 ,因此可得 ,通项公式即为 ,倒推即可求解,初始条件为 。然后做一次前缀和即可求出 。
但是因为这里是每个人的势能都平均减少 ,因此所有 个人的势能加起来就会平均减少 ,因此真正的势能变化量转化为期望操作次数时还需要额外除以 。
最后计算终止态势能 ,根据上面的分析可知期望操作次数就是 ,其中 是势能的期望变化量,即 。
时间复杂度为 ,瓶颈在于需要求 次逆元,可以用科技做到 。 :::
:::success[Code]
namespace lowspeed_song {
const int i36 = 859599304;
inline void init() {
}
int a[N], f[N];
inline void sol() {
int n, m = 0; cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i], m = (m + a[i]) % mod;
for (int i = 1; i < N; ++i) f[i + 1] = ((m * (n - 1) % mod * inversion(m - i) % mod + mod + 2 - n) * f[i] % mod + mod - i * (n - 1) % mod * inversion(m - i) % mod * (f[i - 1] + 1) % mod) % mod;
int res = (mod - f[m]) % mod; for (int i = 1; i <= n; ++i) res = (res + f[a[i]]) % mod;
cout << res << '\n';
}
} // namespace lowspeed_song:::
难度:黑-
鲜活指数:暂无评定
喜欢的话,留下你的评论吧~