CF1626F A Random Code Problem
给出一个序列 ,执行以下内容:
long long ans = 0; // create a 64-bit signed variable which is initially equal to 0 for(int i = 1; i <= k; i++) { int idx = rnd.next(0, n - 1); // generate a random integer between 0 and n - 1, both inclusive // each integer from 0 to n - 1 has the same probability of being chosen ans += a[idx]; a[idx] -= (a[idx] % i); }
求 的期望值,。
期望
我们发现 ,因此,设 ,可以发现,每个数 有 的部分是会改变的,其他部分是不会变的,于是每个数可以将不变的部分计入答案,然后 ,于是问题的值域缩小到了 ,可以直接维护 表示通过 次操作后,值为 的期望个数。
于是答案为
考虑转移,每个数有 的概率被操作,否则不变,于是根据期望的线性性:
然后 可以滚动数组优化,复杂度 。但是要注意常数问题,特别是我 C++14 直接 T 了,C++17 就可以了。
本博客作者:Werner_Yin(https://www.cnblogs.com/werner-yin/) ,转载时请注明出处,谢谢支持!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】