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
  • 相关阅读:
    ubuntu 12.04 配置iscsi共享及挂载iscsi共享
    python_数据类型
    python_基本操作
    shell习题第5题:批量更改文件后缀名
    shell习题第4题:监控ip地址存活
    shell习题第3题:统计内存大小
    shell习题第2题:统计ip访问量
    shell习题第1题:每日一文件
    IIS网站的应用程序与虚拟目录的区别及应用
    http状态码
  • 原文地址:https://www.cnblogs.com/cdcq/p/12668049.html
Copyright © 2011-2022 走看看