题目
// for pascal
readln(n,A,B,C,q[1]);
for i:=2 to n do
q[i] := (int64(q[i-1]) * A + B) mod 100000001;
for i:=1 to n do
q[i] := q[i] mod C + 1;
// for C/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;
输入
3 2 0 4 1
输出
1.167
解题思路
错位后是否是相同的?
前一位有 Ai 个答案,每一个答案都有
1
A
i
\frac{1}{Ai}
Ai1 的概率被选中
后一位有 Ai + 1 个答案,每一个答案都有
1
A
i
+
1
\frac{1}{Ai + 1}
Ai+11 的概率被选中
那么两个题重叠选项是 min(Ai, Ai+1)
那么在Ai 和 Ai+1中选中同一个数的概率为
1
A
i
∗
1
A
i
+
1
∗
m
i
n
(
A
i
,
A
i
+
1
)
\frac{1}{Ai} * \frac{1}{Ai + 1} * min(Ai, Ai+1)
Ai1∗Ai+11∗min(Ai,Ai+1)
Code
#include <bits/stdc++.h>
using namespace std;
int n, A, B, C, a[10001000];
long 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 = ans + min(a[i], a[i + 1]) * 1.0 / (1.0 * a[i] * a[i + 1]);
printf("%.3Lf", ans);
}