首页 > 其他分享 >LOJ6118 「2017 山东二轮集训 Day7」鬼牌

LOJ6118 「2017 山东二轮集训 Day7」鬼牌

时间:2024-11-06 15:42:29浏览次数:2  
标签:frac Day7 sum 调和级数 times LOJ6118 颜色 鬼牌 include

题意

有 \(n\) 个球,\(m\) 种颜色,\(i\) 种颜色有 \(a_i\) 个球。

每次随机选择两个球 \(x\),\(y\)。使两个球的颜色都变为 \(y\) 的颜色。

问最终只有一个颜色的球的期望步数。

\(n \le 10 ^ 9, m \le 10 ^ 5\)。

Sol

显然的,考虑先枚举最终颜色,我们只关心当前有多少个最终颜色的球。

于是设 \(f_i\) 表示当前有 \(i\) 个最终颜色的球,最终获胜的期望步数的贡献。

\(f_0 = 0, f_n = 0\),答案就是 \(\sum_{f_{a_i}}\)。

注意到实际上当前情况是有概率不会获胜,也就是无法全部变为最终颜色的球的,很影响我们进行 \(\texttt{dp}\)。

于是先设 \(g_i\) 表示当前有 \(i\) 个最终颜色的球的获胜概率,\(g_0 = 0, g_n = 1\)。

由于是概率,自己不会对自己产生贡献,可以写出转移:\(g_i = \frac{g_{i - 1} + g_{i + 1}}{2}\)。

集中注意力可以发现 \(g_i = \frac{i}{n}\)。

回到 \(f\),考虑计算当前状态会产生变化的期望步数。

设一次操作状态没有变化的概率为 \(p\),\(q = 1 - p\) 有:

\[q = \frac{2 \times i \times (n - i)}{n \times (n - 1)} \]

期望步数为:

\[\sum_{i = 0} ^ {\infty} (i + 1) p ^ i q \]

Lemma. \(\sum_{i = 0} ^ {\infty} k ^ i = \frac{1}{1 - k}\)

同理,设 \(s = \sum_{i = 0} ^ {\infty} (i + 1) p ^ i\)。

可得:\(p s + \frac{1}{1 - p} = s\),解得 \(s = \frac{1}{(1 - p) ^ 2}\)。

那么就是:

\[\frac{q}{(1 - p) ^ 2} \]

然后这个东西需要乘上 \(g_{i - 1}\) 和 \(g_{i + 1}\)。

于是就是:

\[\frac{1}{2} \times (\frac{q(i - 1)}{(1 - p) ^ 2 n} + \frac{q(i + 1)}{(1 - p) ^ 2 n}) \]

代入 \(f\):

\[f_i = \frac{1}{2}(f_{i - 1} + f_{i + 1}) + \frac{n - 1}{2 \times (n - i)} \]

移一下,写成递推式。

\[f_i = 2 f_{i - 1} - f_{i - 2} - \frac{n - 1}{n - i + 1} \]

使用膜法/暴力展开/集中注意力。

\[f_i = i \times f_1 - \sum_{j = 1} ^ {i - 1} j \times \frac{n - 1}{n - i + j} \]

由于我们知道 \(f_n = 0\),代入解得 \(f_1 = \frac{(n - 1) ^ 2}{n}\)。

把式子再变一下就可以做了,注意到 \(\sum\) 里面把 \(n - 1\) 提出来是一个上指标乘调和级数。

直接用 \(1\) 减去她,代入调和级数:

\[f_i = \frac{i \times (n - 1) ^ 2}{n} + (n - 1)((n - i) \times (H_{n - 1} - H_{n - i}) - i + 1) \]

这样就做完了,复杂度瓶颈在于调和级数的计算。

有个小 \(\texttt{trick}\) 就是调和级数近似于 \(\ln + 0.577\),直接暴力计算即可。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <cmath>
#define ld long double
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
    int p = 0, flg = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') flg = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        p = p * 10 + c - '0';
        c = getchar();
    }
    return p * flg;
}
void write(int x) {
    if (x < 0) {
        x = -x;
        putchar('-');
    }
    if (x > 9) {
        write(x / 10);
    }
    putchar(x % 10 + '0');
}
bool _stmer;

const int N = 1e6 + 5;

array <ld, N> h;

ld H(int x) {
    if (x > 1e6) return log(x) + 0.577;
    else return h[x];
}

bool _edmer;
int main() {
    cerr << (&_stmer - &_edmer) / 1024.0 / 1024.0 << "MB\n";
    for (int i = 1; i <= 1e6; i++)
        h[i] = h[i - 1] + 1.0 / i;
    int n = read(), q = read();
    ld ans = 0;
    while (q--) {
        ld x = read();
        ans += (ld)x * (n - 1) * (n - 1) / n + (n - 1) * (n - x) * (H(n - 1) - H(n - x)) - (n - 1) * (x - 1);
    }
    printf("%.8Lf\n", ans);
    return 0;
}

标签:frac,Day7,sum,调和级数,times,LOJ6118,颜色,鬼牌,include
From: https://www.cnblogs.com/cxqghzj/p/18530352

相关文章

  • 天天学编程Day7
    每日一道编程题155. 最小栈classMinStack{public://存储栈中元素及其出现次数的映射map<int,int>m;//存储实际栈元素的栈stack<int>s1;//记录当前栈中的最小元素intmin_num;MinStack(){//初始化时将最小元素设为......
  • DAY75WEB 攻防-验证码安全篇&接口滥用&识别插件&复用绕过&宏命令填入&滑块类
    知识点:1、验证码简单机制-验证码过于简单可爆破2、验证码重复使用-验证码验证机制可绕过3、验证码智能识别-验证码图形码被可识别4、验证码接口调用-验证码触发接口可枚举图片验证码-识别插件-登录爆破&接口枚举验证码识别绕过等技术适用于:口令存在爆破,接口枚举调用,任意......
  • 备战蓝桥杯JAVA B组Day7
    备战蓝桥杯JAVAB组Day7前言零基础小白备战蓝桥杯第七天,刷题内容为:洛谷题单【入门3】循环结构。P5722【深基4.例11】数列求和AC代码:importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(......
  • Day7 备战CCF-CSP练习
    Day7题目描述栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。栋栋的连锁店所在的区域可以看成是一个\(n×n\)的方格图(如下图所示),方格的格点上的位置上可能包含栋栋的分店(绿色标注)或者客户(蓝色标注),有一些格点是......
  • DAY7 继承&多态
    继承 目的提高代码的重用性,减少一些重复代码的书写权限修饰符就是是用来限制类中的成员(成员变量、成员方法、构造器)能够被访问的范围。private只能本类缺省本类、同一个包中的类protected本类,同一个包中的类、子孙类中public任意位置特点单继承:Java是单继承模......
  • 代码随想录算法训练营day7|● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ●
    学习资料:https://programmercarl.com/0015.三数之和.html#其他语言版本学习记录:454.四数相加(hash_dict,前两个数一组遍历a+b,后两个数一组遍历找0-(a+b))点击查看代码classSolution:deffourSumCount(self,nums1:List[int],nums2:List[int],nums3:List[int],nums4:......
  • 代码源CSP-S模拟赛Day7-9赛后总结
    代码源CSP-S模拟赛Day7-9赛后总结Day7赛时先扫一遍题,T1显然数位dp,感觉放在T1应该不难,而且题面有一种很亲切的感觉,感觉很可做。T2简单思考一下发现最终合成的数就是\(a_1\),\(a_2\),\(a_3\)……,\(a_n\)这n个数填正负号再加上一个k的倍数,估计会有一些比较智慧的手法,感觉很......
  • 代码随想录算法训练营day7|704.二分查找、27.移除元素、977.有序数组的平方
    学习资料:https://programmercarl.com/数组理论基础.html理解:双指针可以同时获取一个数组的两个位置的值二分查找:根据区间范围(左闭右闭、左闭右开)来判断左右指针比较方式刷题记录:704.二分查找(左闭右闭则<=,左右指针,middle=left+(right-left)//2,因为考虑了等号情况所以下一步l......
  • Day7 列表,元组,字典,集合类型的内置方法
    今天仍然没复习,因为人家留作业了但我没有*-*,今天仍然学的内置方法,昨天学的各种数据的,今天学的列表,元组,字典,集合等类型的内置方法,学了好多好多快捷语言,没法概述,但又有一点,明天总复习完一定要先总结一下哪些是直接更改可以直接输出,哪些是操作,需要操作完在输出,直接输出返回none。哎对......
  • 【2021提高组十连测day7】a
    【2021提高组十连测day7】a题意:求每个点和其他所有点曼哈顿距离的平方之和。形式化地,求\(\sum_{j=1}^{n}(|x_i-x_j|+|y_i-y_j|)^2(1\lei\len)\)。对于每个点,我们把其他点分成四部分:左上、左下、右上、右下。四个部分可以通过旋转整个坐标系来解决。因此这里讲如何处理左上......