其实做这道题还蛮难受的。。。因为这个每一次有无限种可能我有钱我可以去买无限瓶可乐啊但是不是可口我不是很赞同┓( ´∀` )┏

然后参考了这篇题解发现错位相减这样的方法,让我们一起膜拜 ButterflyDew 罢!%%%%%%

不水了这题怎么做捏?首先我们根据期望 dp 的套路令 \(f_i\) 为收集 \(i\) 个不同球星期望可乐瓶数。

这道题为什么不用倒序处理呢?因为没必要,我们会发现倒序处理和正着来是等价的。

好,那么我们考虑如何从 \(f_i\) 转移到 \(f_{i + 1}\)。我们买一次有 \(\dfrac{n - i}{n}\) 的概率买到不同的,如果我们买两次,注意这里我们是恰好有一个没有买到的,如果两次都买到不同球星说明你是个欧皇那么我们就得从 \(f_i\) 转移到 \(f_{i + 2}\)。恰好没有买到,那么我们假装第一次买到第二次没买到,那么就是 \(\dfrac{n - i}{n}\times \dfrac{i + 1}{n}\)。

总而言之,如果我们买了 \(k\) 次,那么我们有 \(k - 1\) 次买到相同的,那么就是 \((\dfrac{i}{n})^{k - 1}\),还有一次我们买到不同的,因此是 \(\dfrac{n - i}{n}\),那么刚好买到一次不同的的概率是 \((\dfrac{i}{n})^{k - 1}\times \dfrac{n - i}{n}\)。

假设 \(k = \infty\) 则期望是 \(E = 1\times \dfrac{n - i}{n} + 2\times \dfrac{i}{n}\times \dfrac{n - i}{n} + 3\times (\dfrac{i}{n})^2\times \dfrac{n - i}{n} + \dots + k\times(\dfrac{i}{n})^{k - 1}\times \dfrac{n - i}{n}\)。虽然说理论上无穷大是不能随便加减乘除的但是反正我们是 OIer 不是 MOer┓( ´∀` )┏

两边同乘 \(\dfrac{i}{n}\),然后相减得到 \(E = 1 + \dfrac{i}{n} + (\dfrac{i}{n})^2 + \dots + (\dfrac{i}{n})^{k - 1} - k(\dfrac{i}{n})^k \dfrac{n - i}{n}\)。众所周知,一个大于 \(0\) 小于 \(1\) 的数字的无穷大次方无限趋于 \(0\) 因此我们可以把它看成 \(0\)(看度娘才知道的的),因此这个期望是个等差数列,\(E = \dfrac{n(1 - (\frac{i}{n})^{k - 1})}{n - i} = \dfrac{n}{n - i}\)。

因此 \(f_{i} = f_{i - 1} + E = f_{i - 1} + \dfrac{n}{n - i}\),很容易知道 \(f_n = \dfrac{n}{1} + \dfrac{n}{2} +\dots \dfrac{n}{n} = n(1 + \dfrac{1}{2} + \dots + \dfrac{1}{n})\)。

代码,这题输出确实是最难搞得,反正写起来蛮难受的说(悲

//SIXIANG
#include <iostream>
#define int long long
#define MAXN 100000
#define QWQ cout << "QWQ" << endl;
using namespace std;
int gcd(int n, int m) {
if(!m) return n;
else return gcd(m, n % m);
}
int divide(int x) {
int len = 0;
do {
len++;
x /= 10;
} while(x);
return len;
}
struct frac {
int mo, so;
};
frac add(frac A, frac B) {
int a = A.mo, b = A.so;
int c = B.mo, d = B.so;
frac ans; ans.mo = ans.so = 0; ans.mo = a * d + c * b;
ans.so = b * d;
int G = gcd(ans.mo, ans.so);
ans.mo /= G, ans.so /= G; return ans;
} frac mul(frac A, int B) {
frac ans = A;
ans.mo *= B;
int G = gcd(ans.mo, ans.so);
ans.mo /= G, ans.so /= G;
return ans;
} void print(frac f) {
int a = f.mo, b = f.so;
if(a % b == 0) {
cout << a / b << endl;
return ;
}
int ig = a / b, ss = a % b; int il = divide(ig);//整数部分数位长度
int bl = max(divide(ss), divide(b));//横杠长度
for(int p = 1; p <= il; p++) cout << " ";
cout << ss << endl; cout << ig;
for(int p = 1; p <= bl; p++) cout << "-";
cout << endl; for(int p = 1; p <= il; p++) cout << " ";
cout << b << endl;
}
signed main() {
int n; cin >> n;
frac ans, now;
ans.mo = 1, ans.so = 1;
for(int p = 2; p <= n; p++) {
now.mo = 1, now.so = p;
ans = add(ans, now);
}
ans = mul(ans, n);
print(ans);
}

题解 [SHOI2002] 百事世界杯之旅的更多相关文章

  1. 洛谷 P1291 [SHOI2002]百事世界杯之旅 解题报告

    P1291 [SHOI2002]百事世界杯之旅 题目描述 "--在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽 ...

  2. luogu P1291 [SHOI2002]百事世界杯之旅

    题目链接 luogu P1291 [SHOI2002]百事世界杯之旅 题解 设\(f[k]\)表示还有\(k\)个球员没有收集到的概率 再买一瓶,买到的概率是\(k/n\),买不到的概率是\((n-k ...

  3. COGS 1224. [SHOI2002]百事世界杯之旅(期望概率)

    COGS 1224. [SHOI2002]百事世界杯之旅 ★   输入文件:pepsi.in   输出文件:pepsi.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] ...

  4. P1291 [SHOI2002]百事世界杯之旅(概率)

    P1291 [SHOI2002]百事世界杯之旅 设$f(n,k)$表示共n个名字,剩下k个名字未收集到,还需购买饮料的平均次数 则有: $f(n,k)=\frac{n-k}{n}*f(n,k) + \ ...

  5. 洛谷P1291 [SHOI2002]百事世界杯之旅 [数学期望]

    题目传送门 百事世界杯之旅 题目描述 “……在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听, ...

  6. P1291 [SHOI2002]百事世界杯之旅

    题目描述 “……在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听,更克赴日韩观看世界杯.还不赶 ...

  7. [SHOI2002]百事世界杯之旅

    题目:"--在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听,更克赴日韩观看世界杯. ...

  8. 洛谷P1291 [SHOI2002]百事世界杯之旅(期望DP)

    题目描述 “……在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听,更克赴日韩观看世界杯.还不赶 ...

  9. [Luogu1291][SHOI2002]百事世界杯之旅

    题目描述 “……在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听,更克赴日韩观看世界杯.还不赶 ...

  10. ●洛谷P1291 [SHOI2002]百事世界杯之旅

    题链: https://www.luogu.org/recordnew/show/5861351题解: dp,期望 定义dp[i]表示还剩下i个盖子没收集时,期望还需要多少次才能手机完. 初始值:dp ...

随机推荐

  1. 如何使用C#在Excel中插入分页符

    在日常办公中,我们经常会用到Excel文档来帮助我们整理数据.为了方便打印Excel工作表,我们可以在Excel中插入分页符.各种处理软件一般都会自动按照用户所设置页面的大小自动进行分页,以美化文档的 ...

  2. python-简单模块的使用

    提示:简单模块了解掌握 @ 目录 uuid模块 calendar日历模块 time模块 datetime模块 os模块 sys模块 random模块 json和pickle模块 json pickle ...

  3. jQuery使用 前端框架Bootstrap

    目录 jQuery查找标签 1.基本选择器 2.组合选择器 3.后代选择器 4.属性选择器 5.基本筛选器 7.筛选器方法 链式操作的本质 操作标签 1.class操作 2.位置操作 3.文本操作 4 ...

  4. Python 大数据量文本文件高效解析方案代码实现

    大数据量文本文件高效解析方案代码实现 测试环境 Python 3.6.2 Win 10 内存 8G,CPU I5 1.6 GHz 背景描述 这个作品来源于一个日志解析工具的开发,这个开发过程中遇到的一 ...

  5. 【转载】WebBrowser控件的常用方法、属性和事件

    1. 属性 属性 说明 Application 如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch).如果在宿主对象中自动化对象无效,这个程序将返回Web ...

  6. 【爬虫+数据分析+数据可视化】python数据分析全流程《2021胡润百富榜》榜单数据!

    目录 一.爬虫 1.1 爬取目标 1.2 分析页面 1.3 爬虫代码 1.4 结果数据 二.数据分析 2.1 导入库 2.2 数据概况 2.3 可视化分析 2.3.1 财富分布 2.3.2 年龄分布 ...

  7. 说一下三种jar包在Linux的启动方式

    最近在linux上发布了一个SpringBoot项目,研究了一下jar包在Linux上的集中启动方式,特在此分享一下. 这里默认要启动的jar包为demo-0.0.1-SNAPSHOT.jar 第一种 ...

  8. 10分钟做好 Bootstrap Blazor 的表格组件导出 Excel/Word/Html/Pdf

    上篇: Bootstrap Blazor 实战 通用导入导出服务(Table组件) 1.新建工程 新建工程b14table dotnet new blazorserver -o b14table 将项 ...

  9. Spring Cloud服务发现组件Eureka

    简介 Netflix Eureka是微服务系统中最常用的服务发现组件之一,非常简单易用.当客户端注册到Eureka后,客户端可以知道彼此的hostname和端口等,这样就可以建立连接,不需要配置. E ...

  10. 3DText无法被物体遮挡 - 解决

    目录 开篇: 问题复现: 如何解决: 1.创建一个Shader 2.创建一个Material 3.给Material赋值字体 4.给3DText属性赋值 5.查看效果 希望大家:点赞,留言,关注咯~ ...