首页 > 其他分享 >【题解】CF850F Rainbow Balls

【题解】CF850F Rainbow Balls

时间:2023-02-09 18:45:03浏览次数:40  
标签:Balls frac int 题解 CF850F base 转移 dp mod

整体方向很常规,但是最后的处理比较仙,记一下。

思路

期望 dp.

首先意识到最终会变成同一种颜色,并且不同颜色的期望步数不同。

考虑到 \(n \leq 2.5 \times 10^3\),考虑钦定最终的颜色。

假设钦定的颜色为 \(c\),令 \(f[i]\) 为当前已有 \(i\) 个颜色为 \(c\) 的球时,令所有球颜色变成 \(c\) 需要的最小步数。

转移简单分讨一下选同色球和选异色球的情况,所以直觉上的转移是这样的。

\(f[i] = (f[i - 1] + f[i + 1]) p + (f[i] + 1)\),其中 \(p\) 是选到异色球的概率。

令球的总数为 \(m\),可以推出 \(p = \frac{i (m - i)}{m (m - 1)}\),所以原方程等价于 \(f[i] = (f[i - 1] + f[i + 1]) \frac{i (m - i)}{m (m - 1)} + (f[i] + 1)\).

上面这种转移是一种误区,原因是期望 dp 转移对边界的依赖。

考虑这个 dp 的边界情况,\(f[m] = 0\),但是 \(f[0]\) 无法定义:因为没有颜色为 \(c\) 的球时无法通过操作获得颜色为 \(c\) 的球。

一般情况下的 dp 都会根据题目需要把这个值设成 \(0\) 或者 \(\pm \infty\),但是期望 dp 的转移一般是通过化简相邻的 \(f\) 之间的关系得到的,因此强行给 \(f[0]\) 赋值会导致后面的 dp 都是错的。

所以我们考虑绕过 \(f[0]\) 转移。

\((f[i - 1] + f[i + 1]) p\) 这一项符合期望的定义,不用修正。需要考虑的是 \(f[i] + 1\) 这一项:在球的个数不能为 \(0\) 的前提下,考虑使 \(i\) 变成 \(m\) 的期望步数。

这个问题放在数轴上是一个经典的问题。设 \(g[i]\) 表示从 \(i\) 到达 \(m\) 的概率。因为当前点等概率向左右走,所以 \(g[i] = (g[i - 1] + g[i + 1]) p + (1 - 2p) g[i]\),这里 \(p\) 的定义和上面相同。

因为 \(p[0] = 0, p[s] = 1\),所以用 \(0\) 转移没有上面的那种影响。

上式化简得 \(g[i] - g[i - 1] = g[i + 1] - g[i]\),所以 \(g[i] = \frac{i}{m}\).

考虑代回 \(f\) 的转移方程,用 \(f[i]\) 转移的概率是 \(\frac{i}{m}\),代价是 \(1\),所以有:\(f[i] = (f[i - 1] + f[i + 1]) p + f[i] \frac{i}{m}\).

化简得到 \(f[i] - f[i + 1] = f[i - 1] - f[i] + \frac{m - 1}{m - i}\).

边界情况特殊考虑。因为 \(f[0]\) 不存在,所以 \(f[1] = f[2] p + (1 - 2p) f[1] + \frac{1}{m}\),也就是 \(f[2] = 2 f[1] - 1\).

所以 \(f[1] = f[1] - f[m] = \sum\limits_{i = 2}^m f[i - 1] - f[i] = (m - 1) (f[1] - f[2]) + \sum\limits_{i = 2}^{m - 1} \frac{m - 1}{m - i} (m - i)\)

又因为 \(f[2] = 2 f[1] - 1\),所以 \(f[1] = \frac{(m - 1)^2}{m}\).

处理出 \(f[1], f[2]\) 就可以按照递推式求 \(f\) 了。答案是 \(\sum\limits_{i = 1}^n f[a_i]\).

递推式整理出来是 \(f[i] = (2 f[i - 1] - f[i - 2]) - \frac{m - 1}{m - i}\).

时间复杂度 \(O(n \log n)\),也可以线性求逆元做到 \(O(n)\).

另外有神仙用停时和鞅怒草此题,不太懂,但感觉好强。

代码

#include <cstdio>
using namespace std;

const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;

int n, m;
int a[maxn], f[maxn];

inline int max(const int &a, const int &b) { return (a >= b ? a : b); }
inline void add(int &x, int y) { if ((x += y) >= mod) x -= mod; }

int qpow(int base, int power)
{
    int res = 1;
    while (power)
    {
        if (power & 1) res = 1ll * res * base % mod;
        base = 1ll * base * base % mod;
        power >>= 1;
    }
    return res;
}

int main()
{
    scanf("%d", &n);
    int lim = 0;
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]), m += a[i], lim = max(lim, a[i]);
    f[1] = 1ll * (m - 1) * (m - 1) % mod * qpow(m, mod - 2) % mod;
    f[2] = (2 * f[1] % mod - 1 + mod) % mod;
    for (int i = 2; i <= lim; i++) f[i + 1] = ((2 * f[i] % mod - f[i - 1] + mod) % mod - 1ll * (m - 1) * qpow(m - i, mod - 2) % mod + mod) % mod;
    int ans = 0;
    for (int i = 1; i <= n; i++) ans = (ans + f[a[i]]) % mod;
    printf("%d\n", ans);
    return 0;
}

标签:Balls,frac,int,题解,CF850F,base,转移,dp,mod
From: https://www.cnblogs.com/lingspace/p/cf850f.html

相关文章

  • 【题解】CF1093G Multidimensional Queries
    记一下这种有趣的trick.思路线段树。绝对值按照惯例是可以拆的,并且可以拆出一正一负两个数。考虑到维数很小,可以考虑状压表示拆除绝对值之后每一维值的正负。并且因......
  • SAOI 题解汇总
    题解汇总A.Chery的魔法药水与lrc的韭菜所有部分分代码及标程均在这里。这个题目是我们前面的月考卷子改编后的idea,去年就出了,今年翻出来经过加强得到了这道入门题......
  • keepalived的状态不断切换的问题解决
    转载自:https://blog.csdn.net/weixin_43515220/article/details/104959814================= 笔者在搭建nginx+keepalived架构的过程中,发现存在keepalived的vip不断迁......
  • vue封装的组件发布到npm,超详细及问题解决
    1.创建一个新的vue项目vuecreatebase-page创建一个新的项目,npmrunserve之后删掉多余的代码2.将自己的组件代码移入项目中增加一个新的packages文件夹(组件文件......
  • 2020 第十一届蓝桥杯大赛软件赛省赛(第二场),C/C++大学B组题解
    第1题——门牌制作(5分)枚举1到2020,判断有多少个字符2。答案624#include<bits/stdc++.h>usingnamespacestd;intmain(){intcnt=0;for(inti=1;i<=2020;......
  • 2021 第十二届蓝桥杯大赛软件赛省赛(第二场),C/C++大学B组题解
    第1题——求余(5分)直接输出2021%20答案:1#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<2021%20;return0;}第2题——双阶乘(5分)求2021的双阶乘......
  • Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized. 问题解决方法
    先说结论,这是由于itext和asian版本不一直造成的。如果你的需求仅仅是生成pdf,则使用解决办法1,如果需求有导出word则使用解决办法2解决办法1:将pom文件的com.lowagie全部......
  • 题解 SP2666【Query on a tree IV】
    题目分析首先,对原树进行轻重链剖分,并对于每一条重链分别建一颗线段树(原因下文会提到)。令\(dfn\)为某个点的dfs序,\(rnk(i)\)为\(dfn\)为\(i\)的点的编号。我们......
  • D - Pair of Balls
    D-PairofBallshttps://atcoder.jp/contests/abc216/tasks/abc216_d 思路m个桶,n个颜色,第一轮遍历所有桶的最上面球的颜色,将相同颜色的球所在队列,计入color节......
  • Please wait ...... autocad 2018问题解决
    问题:程序运行中弹出如下窗口按照步骤安装又安装不了,一直失败原因:autocad软件没有彻底卸载干净解决方法:1、在电脑左下角,控制面板中,找到AUTOCAD,进行卸载,带有AUTODESK一般也会......