CF1626F A Random Code Problem

给出一个序列 {ai},执行以下内容:

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);
}

ans 的期望值,n107,k17,ai109


  期望

  我们发现 k17,因此,设 M=lcm(1,2,,17)=12252240,可以发现,每个数 xxmod M 的部分是会改变的,其他部分是不会变的,于是每个数可以将不变的部分计入答案,然后 mod M ,于是问题的值域缩小到了 M,可以直接维护 fi,j 表示通过 i1 次操作后,值为 j 的期望个数。

  于是答案为

fi,j×jn

  考虑转移,每个数有 1n 的概率被操作,否则不变,于是根据期望的线性性:

{fi,j×1nfi+1,jfi,j×n1nfi+1,j(j mod i)

  然后 f 可以滚动数组优化,复杂度 O(Mk)。但是要注意常数问题,特别是我 C++14 直接 T 了,C++17 就可以了

  代码

posted @   Werner_Yin  阅读(79)  评论(5编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示