zoukankan      html  css  js  c++  java
  • 【洛谷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
    ",ans);
    16     return 0;
    17 }
    View Code
  • 相关阅读:
    hadoop再次集群搭建(3)-如何选择相应的hadoop版本
    48. Rotate Image
    352. Data Stream as Disjoint Interval
    163. Missing Ranges
    228. Summary Ranges
    147. Insertion Sort List
    324. Wiggle Sort II
    215. Kth Largest Element in an Array
    快速排序
    280. Wiggle Sort
  • 原文地址:https://www.cnblogs.com/cdcq/p/12668049.html
Copyright © 2011-2022 走看看