题解 P1297 [国家集训队]单选错位

题解 P1297 [国家集训队]单选错位

对于第\(i\)个题,有三种情况:

  1. \(a_i=a_{i+1}\),则\(i\)\(i+1\)期望相同,为\(\frac{1}{a_i}\)
  2. \(a_i>a_{i+1}\),则答案有\(\frac{a_{i+1}}{a_i}\)的可能在\(1\sim a_i\)中,可能性为\(\frac{1}{\min(a_i,a_{i+1})}=\frac{1}{a_{i+1}}\)。期望为\(\frac{a_{i+1}}{a_i}\times\frac{1}{a_{i+1}}=\frac{1}{a_i}\)
  3. \(a_i<a_{i+1}\),则答案有\(\frac{a_i}{a_{i+1}}\)的可能在\(1\sim a_{i+1}\)中,可能性为\(\frac{1}{\min(a_i,a_{i+1})}=\frac{1}{a_i}\)。期望为\(\frac{a_{i}}{a_{i+1}}\times\frac{1}{a_i}=\frac{1}{a_{i+1}}\)

故有\(ans=\sum_{i=1}^n{\frac{1}{max(a_i,a_{i+1})}}\)

\(Code\)

#include<bits/stdc++.h>
using namespace std;

const int N=1e7+7;
int a[N],A,B,C,n;
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]=((long long)a[i-1]*A+B)%100000001;
	for(int i=1;i<=n;i++)
		a[i]=a[i]%C+1;
	a[n+1]=a[1];//特殊处理一下 
	for(int i=1;i<=n;i++)
		ans+=(double)1/max(a[i],a[i]+1);
	printf("%.3lf",ans);
	return 0;
}
posted @ 2021-03-01 19:55  Sure042  阅读(139)  评论(0编辑  收藏  举报