单选错位【ybtoj高效进阶6-6-1】【luogu P1297】
思路:【期望模板题】
一道非常基础的期望题,竟然不是期望DP
我们设答对第i道题的概率为
p
[
i
]
p[i]
p[i],因为本题不存在权值(权值是1),那么很显然,我们有
a
n
s
=
∑
i
=
1
n
p
[
i
]
ans=\sum\limits_{i=1}^{n}p[i]
ans=i=1∑np[i]
那么
p
[
i
]
p[i]
p[i]怎么求呢?
首先第i题和第i-1题答案相同的概率是
p
[
i
]
=
1
m
a
x
(
a
[
i
]
,
a
[
i
−
1
]
)
p[i]=\frac{1}{max(a[i],a[i-1])}
p[i]=max(a[i],a[i−1])1 很显然那个的选项多那个就是分母。
然后就没有然后了,成了一道水题。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#define r register
#define rep(i,x,y) for(r ll i=x;i<=y;++i)
#define per(i,x,y) for(r ll i=x;i>=y;--i)
using namespace std;
typedef long long ll;
const ll V=1e7+10;
ll a[V],n,A,B,C;
double ans;
int main()
{
scanf("%lld%lld%lld%lld%lld",&n,&A,&B,&C,&a[1]);
rep(i,2,n)
a[i]=(a[i-1]*A+B)%100000001;
rep(i,1,n)
{
a[i]%=C;
++a[i];
}
ans=(1.0)/(double)max(a[1],a[n]); //特判1和n
rep(i,2,n)
ans+=(1.0)/(double)max(a[i],a[i-1]);
printf("%.3f",ans);
return 0;
}