【ybt高效进阶6-6-1】【luogu P1297】单选错位(期望)

这篇博客讨论了解决一个有趣的数学问题,即在一个单选题错位答题情况下,正确答案期望数量的计算。通过分析相邻选项的匹配概率,得出当两个选项数量不同时,期望正确答案数为两者最大值的概率。代码展示了如何利用C++实现这一思路。
摘要由CSDN通过智能技术生成

单选错位

题目链接:ybt高效进阶6-6-1 / luogu P1297

题目大意

有 n 个单选题,每道题有一定的选项,然后每道题的答案是在每个选项中等概率随机一个。
然后你问你如果你的答案都是对的,但是你都填到了下一题的位置(如果是最后一题就填到第一题),你能对的题的期望个数。

思路

首先不难想到要能对就是要相邻两个选项是选的一样。

那我们可以对于每一个相邻的算它能对的概率,然后加在一起就是答案了。
那如果两个选项的个数分别是 x , y x,y x,y 个,那你少的那个任选,多的那个选到少的选的那个就可以了。
所以是 1 max ⁡ ( x , y ) \dfrac{1}{\max(x,y)} max(x,y)1

然后就好啦。

代码

#include<cstdio>
#include<iostream>
#define ll long long

using namespace std;

int n, A, B, C, a[10000001];
double ans;

int main() {
	scanf("%d %d %d %d %d", &n, &A, &B, &C, a + 1);
	for (int i = 2; i <= n; i++)
		a[i] = ((ll) a[i - 1] * A + B) % 100000001;
	for (int i = 1; i <= n; i++)
		a[i] = a[i] % C + 1;
	
	for (int i = 1; i <= n; i++) {
		int to = i + 1;
		if (to > n) to = 1;
		ans += 1.0 / max(a[i], a[to]);
	}
	
	printf("%.3lf", ans);
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值