题意:
有n个题目,每个题目有 a i a_i ai个选项,由题目所给的代码生成序列a,在保证原先答案全部正确的情况下,将第i题的答案抄在了第i+1题上,问你现在做对题目的期望。
思路:
太离谱了,还以为会卡精度啥的,结果一发就过了,让我对数据产生了怀疑。
看第i题的选项数
a
i
a_i
ai,因为目前
a
i
a_i
ai处的答案来自于
a
i
−
1
a_{i-1}
ai−1,如果
a
i
−
1
≤
a
i
a_i{-1}\leq a_i
ai−1≤ai,即现在在小于
a
i
a_i
ai的数中随机选一个数,而这个数成为正确答案的概率为
1
/
a
i
1/a_i
1/ai。
总结下来就是,第i题正确的概率为
1
/
m
a
x
(
a
i
,
a
i
−
1
)
1/max(a_i,a_{i-1})
1/max(ai,ai−1)。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define endl '\n'
int a[10000010];
int main()
{
int n,A,B,C;
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;
for(int i = 1; i <= n; i++)cout<<a[i]<<" "<<endl;
double ans = 0;
for(int i = 2; i <= n; i++)
{
ans += 1.0/max(a[i],a[i-1]);
}
ans += 1.0/max(a[1],a[n]);
printf("%.3lf\n",ans);
}