luogu P1297 [国家集训队]单选错位
Description–
试卷上共有 n n n 道单选题,第 i i i 道单选题有 a i a_i ai 个选项,每个选项成为正确答案的概率都是相等的。
z z l zzl zzl 认真地做完了这 n n n 道题目,可是没想到答题卡抄错位了:第 i i i 道题目的答案被 z z l zzl zzl 认真地抄到了答题纸上的第 i + 1 i+1 i+1 道题目的位置上,特别地,第 n n n 道题目的答案则被 z z l zzl zzl (用超能力) 抄到了第 1 1 1 道题目的位置上。
现在 可怜的 z z l zzl zzl 已经走出考场没法改了,不过她还是想知道自己期望能做对几道题目,这样她就知道会不会被 开考秒阿克的 k j kj kj 鄙视了。
我们假设 运气很好的 z z l zzl zzl 没有做错任何题目,只是答案抄错位置了。
Input–
n n n 很大,为了避免读入耗时太多,输入文件只有 5 5 5 个整数参数 n , A , B , C , a 1 n, A, B, C, a_1 n,A,B,C,a1 ,由上交的程序产生数列 a a a。下面给出 C + + C++ C++ 的读入语句和产生序列的语句(默认从标准输入读入):
scanf("%d%d%d%d%d", &n, &A, &B, &AK, zzl + 1);
for (int i = 2; i <= n; i++)
zzl[i] = ((long long)zzl[i - 1] * A + B) % 100000001;
for (int i = 1; i <= n; i++)
zzl[i] = zzl[i] % AK + 1;
选手可以通过以上的程序语句得到 n n n 和数列 a a a( a a a 的元素类型是 32 32 32 位整数), n n n 和 a a a 的含义见题目描述。
别管什么意思,照搬即可
Output–
输出一个实数,表示 z z l zzl zzl 期望做对的题目个数,保留三位小数。
Sample Input–
3 2 0 4 1
Sample Output–
1.167
说明–
数据范围
对于
30
%
30\%
30% 的数据,
n
≤
10
,
C
≤
10
n\leq 10, C\leq 10
n≤10,C≤10
对于
80
%
80\%
80% 的数据,
n
≤
1
0
4
,
C
≤
10
n\leq 10^4, C\leq 10
n≤104,C≤10
对于
90
%
90\%
90% 的数据,
n
≤
5
×
1
0
5
,
C
≤
1
0
8
n\leq 5\times 10^5, C\leq 10^8
n≤5×105,C≤108
对于
100
%
100\%
100% 的数据,
2
≤
n
≤
1
0
7
,
0
≤
A
,
B
,
C
≤
1
0
8
2\leq n\leq 10^7, 0\leq A,B,C \leq 10^8
2≤n≤107,0≤A,B,C≤108
解题思路–
假设当前的题为 a i a_i ai,则上一题为 a i − 1 a_{i -1} ai−1
- 当 a i < a i − 1 a_i < a_{i -1} ai<ai−1 时,此题做对的可能性为 1 a i − 1 \frac{1}{a_{i -1}} ai−11
- 当 a i > = a i − 1 a_i >= a_{i -1} ai>=ai−1 时,此题做对的可能性为 1 a i \frac{1}{a_i} ai1
可是即便如此 可怜的
z
z
l
zzl
zzl 还是不知道她期望做对的题目个数是多少
于是 无语的
k
j
kj
kj 反手一顿骚操作,并鄙视地说:“每一道题做对的可能性就是
1
m
a
x
(
a
i
,
a
i
−
1
)
\frac{1}{max(a_i,a_{i -1})}
max(ai,ai−1)1啊!!!”
> > > 相加即可快乐获得 z z l zzl zzl的对题期望
代码–
#include <iostream>
#include <cstdio>
using namespace std;
int n, A, B, AK, zzl[10000005];
double kj;
void read()
{
scanf("%d%d%d%d%d", &n, &A, &B, &AK, zzl + 1);
for (int i = 2; i <= n; i++)
zzl[i] = ((long long)zzl[i - 1] * A + B) % 100000001;
for (int i = 1; i <= n; i++)
zzl[i] = zzl[i] % AK + 1; //zzl%AK??(hhhhhhh
}
int main()
{
read();
zzl[0] = zzl[n]; //因为zzl的神奇超能力于是答案n抄到了第1道题目的位置上qaq
for (int i = 1; i <= n; ++i)
kj += 1.0 / max(zzl[i - 1], zzl[i]);
printf("%.3lf", kj);
return 0;
}