【洛谷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 }