单选错位[bzoj2134]
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2134
题解:
每一步正确的概率的倒数之和就是期望。
第i道题正确的概率为1/max(a[i],a[i-1])。因为假设第i题的选项比第i-1题多,那么正确概率为1/a[i-1] * a[i-1]/a[i] ,即第i题的正解在第i-1题的选项中且选对;若第i题选项比第i-1题少,那么概率为1/a[i-1],因为正解一定在a[i-1]中,显然随机选时选到正解的概率为1/a[i-1]。(因为题目之间无关,所以可以看做随机的)。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define LL long long 5 #define RI register int 6 using namespace std; 7 const int INF = 0x7ffffff ; 8 const int N = 1e7 + 10 ; 9 10 inline int read() { 11 int k = 0 , f = 1 ; char c = getchar() ; 12 for( ; !isdigit(c) ; c = getchar()) 13 if(c == '-') f = -1 ; 14 for( ; isdigit(c) ; c = getchar()) 15 k = k*10 + c-'0' ; 16 return k*f ; 17 } 18 int a[N] ; 19 20 int main() { 21 int n, A, B, C ; 22 scanf("%d%d%d%d%d",&n,&A,&B,&C,a+1); 23 for (int i=2;i<=n;i++) a[i] = ((long long)a[i-1] * A + B) % 100000001; 24 for (int i=1;i<=n;i++) a[i] = a[i] % C + 1 ; 25 double ans = 0 ; 26 a[0] = a[n] ; 27 for(int i=0;i<n;i++) ans += 1.0/(double)max(a[i],a[i+1]) ; 28 printf("%.3lf",ans) ; 29 return 0 ; 30 }