cdcq

梦幻小鱼干

导航

【洛谷1297】单选错位

原题:

 

 n<=1e7,a<=1e8

 

首先容易注意到一个性质:

那就是第i道题对答案的贡献只与第i-1道题有关

那么只需考虑每个相邻的一对题(包括1和n这一对),就可以统计出所有题目对答案的贡献,直接加起来就vans了

要问:

为什么第i道题对答案的贡献只与第i-1道题有关?

比如第i-1道题会影响第i道题的得分,而第i道题会影响第i+1道题的得分,但是当第i道题改变的时候,第i和第i+1道题的得分同时变了呀?

实际上,上面的情况确实是成立的,但是我们考虑的是概率,而不是实际情况

第i道题的改变确实影响了前后两道题的得分,但是在茫茫多种情况中,有Π/ai种情况,第i道题选择了答案j,而有Π/a_{i+1}种情况,第i+1道题选择了答案k

令j==k,则有Π/(ai*a_{i+1})种情况,第i+1道题对了,发生的概率为Π/(ai*a_{i+1})/Π=1/(ai*a_{i+1}),期望值为1/(ai*a_{i+1})(因为对了一道题)

这个就比较考验对概率与统计的理解了

这是一种宏观上的统计,只考虑特定情况下的方案数在整体方案数之比,而不考虑方案内的其他属性

而为什么把每道题的期望值加起来就得到答案,就涉及到期望值的可加性(大概是叫这个)

这个仿照上例推一推应该能证出来,我就懒得写了

 

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n,A,B,C,a[11000000];
 5 int main(){
 6 
 7     scanf("%d%d%d%d%d", &n, &A, &B, &C, a + 1);
 8     for (int i = 2; i <= n; i++)
 9         a[i] = ((long long) a[i - 1] * A + B) % 100000001;
10     for (int i = 1; i <= n; i++)
11         a[i] = a[i] % C + 1;
12 
13     double ans=1.0/max(a[1],a[n]);
14     for(int i=2;i<=n;++i)  ans+=1.0/max(a[i],a[i-1]);
15     printf("%.3lf\n",ans);
16     return 0;
17 }
View Code

 

posted on 2020-04-09 17:01  cdcq  阅读(229)  评论(0编辑  收藏  举报