[国家集训队]单选错位

[国家集训队]单选错位

  • 这题应该算我的概率期望入门吧(我太菜了qwq

  • 来看看这题的具体做法吧:

    • 首先我们要先按题目所给要求输入 (a) 序列,然后再进行操作。
    • 假设有两道题,我们可以看出,做对后一道题的概率为古典概率或者说叫事前概率。
    • 我来举个栗子让大家方便理解:有 (2) 件衣服,(3) 条裤子,让我们求所有搭配方案。这是**都会做的,一共有 (2*3=6) 种。再带入题面,两道题所有可能的搭配的方案数就是第一题的选项数乘第二题的选项数,也就是 (a[i]*a[i-1]),然后我们再改一下条件,有两件衣服,颜色分别为 (Red,Blue),3条裤子,颜色分别为 (Red,Blue,Yellow),问衣服和裤子为相同颜色的搭配方案,易得为两种搭配方案。再带入题面,两道题答案可能相同的搭配方案就是两道题中选项较少那题的选项数,也就是 (min(a[i],a[i-1]))
    • 那么我们就可以知道,当衣服和裤子搭配为同一颜色的概率为 (frac{2}{2*3}),同样地,带入题面,做对第 (i) 题地概率为 (frac{min(a[i],a[i-1])}{a[i]*a[i-1]}),通过化简可得: (frac{1}{max(a[i]*a[i-1])})
    • 期望做对题数则为每题做对概率之和,也就是: (answer=sum_{i=1}^n frac{1}{max(a[i]*a[i-1])})
  • 接下来就是一点也不激动人心的代码了:

#include<bits/stdc++.h>//Forever_chen
#define RT register
using namespace std;
template<class t> inline t read(t &x){
	char c=getchar();bool f=0;x=0;
	while(!isdigit(c)) f|=c=='-',c=getchar();
	while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar();
	if(f)x=-x;return x;
}
template<class t>inline void write(t x){
	if(x<0)putchar('-'),write(-x);
	else{if(x>9)write(x/10);putchar('0'+x%10);}
}
template<class t>inline void writeln(t x){
	write(x);putchar('
');
	return;
}
template<class t>inline void write_blank(t x){
	write(x);putchar(' ');
	return;
}
long long n,A,B,C,a[10000010];
double ans;
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	read(n),read(A),read(B),read(C),read(a[1]);
	for (int i=2;i<=n;i++){
		a[i]=((long long)a[i-1]*A+B)%100000001;
	}
	for (int i=1;i<=n;i++){
		a[i]=a[i]%C+1;
	}
	ans=1.0/max(a[n],a[1]);
	for(int i=2;i<=n;i++){
		ans+=1.0/max(a[i],a[i-1]);
	}
	printf("%.3lf",ans);
	//system("pause");
	return 0;
}

原文地址:https://www.cnblogs.com/Forever-chen/p/12832801.html