zoukankan      html  css  js  c++  java
  • 洛谷1297[国家集训队]单选错位

    题目背景

    原 《网线切割》请前往P1577

    题目描述

    gx和lc去参加noip初赛,其中有一种题型叫单项选择题,顾名思义,只有一个选项是正确答案。试卷上共有n道单选题,第i道单选题有ai个选项,这ai个选项编号是1,2,3,…,ai,每个选项成为正确答案的概率都是相等的。lc采取的策略是每道题目随机写上1-ai的某个数作为答案选项,他用不了多少时间就能期望做对∑i=1n1aisum_{i=1}^n frac{1}{a_i}i=1nai1道题目。gx则是认认真真地做完了这n道题目,可是等他做完的时候时间也所剩无几了,于是他匆忙地把答案抄到答题纸上,没想到抄错位了:第i道题目的答案抄到了答题纸上的第i+1道题目的位置上,特别地,第n道题目的答案抄到了第1道题目的位置上。现在gx已经走出考场没法改了,不过他还是想知道自己期望能做对几道题目,这样他就知道会不会被lc鄙视了。

    我们假设gx没有做错任何题目,只是答案抄错位置了。

    输入输出格式

    输入格式:

     

    n很大,为了避免读入耗时太多,输入文件只有5个整数参数n, A, B, C, a1,由上交的程序产生数列a。下面给出pascal/C/C++的读入语句和产生序列的语句(默认从标准输入读入):

    // for pascal
    readln(n,A,B,C,q[1]);
    for i:=2 to n do
    q[i] := (int64(q[i-1]) * A + B) mod 100000001;
    for i:=1 to n do
    q[i] := q[i] mod C + 1;
    
    // for C/C++
    scanf("%d%d%d%d%d",&n,&A,&B,&C,a+1);
    for (int i=2;i<=n;i++)
    a[i] = ((long long)a[i-1] * A + B) % 100000001;
    for (int i=1;i<=n;i++)
    a[i] = a[i] % C + 1;

    选手可以通过以上的程序语句得到n和数列a(a的元素类型是32位整数),n和a的含义见题目描述。

     

    输出格式:

     

    输出一个实数,表示gx期望做对的题目个数,保留三位小数。

     

    输入输出样例

    输入样例#1: 复制
    3 2 0 4 1
    输出样例#1: 复制
    1.167
    

    说明

    【样例说明】

    正确答案   |   gx的答案    | 做对题目| 出现概率
    {1,1,1}    |    {1,1,1}    |    3    |    1/6
    {1,2,1}    |    {1,1,2}    |    1    |    1/6
    {1,3,1}    |    {1,1,3}    |    1    |    1/6
    {2,1,1}    |    {1,2,1}    |    1    |    1/6
    {2,2,1}    |    {1,2,2}    |    1    |    1/6
    {2,3,1}    |    {1,2,3}    |    0    |    1/6

    a[] = {2,3,1}

    共有6种情况,每种情况出现的概率是1/6,gx期望做对(3+1+1+1+1+0)/6 = 7/6题。(相比之下,lc随机就能期望做对11/6题)

    对于30%的数据 n≤10, C≤10

    对于80%的数据 n≤10000, C≤10

    对于90%的数据 n≤500000, C≤100000000

    对于100%的数据 2≤n≤10000000, 0≤A,B,C,a1≤100000000

    *******对于第i道题,第i+1道题有min(1,a[i+1]/a[i])的概率有和a[i]一样的选项;同时对于第i + 1道题,有1/a[i + 1]的概率做对这道题

    所以每道题写对的概率是1/a[i+1]*min(1,a[i+1]/a[i])

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 int i,j,a[10000005],n,A,B,C;
     7 double ans = 0;
     8 int main()
     9 {
    10     scanf("%d%d%d%d%d",&n,&A,&B,&C,a+1);
    11     for (int i=2;i<=n;i++)
    12     a[i] = ((long long)a[i-1] * A + B) % 100000001;
    13     for (int i=1;i<=n;i++)
    14     a[i] = a[i] % C + 1;
    15     for(i = 1;i < n;i++)
    16     {
    17         ans += 1.0 / (double)a[i + 1]  * min(1.0,1.0 * a[i + 1] / (double)a[i]);
    18     }
    19     ans += 1.0 / (double)a[1]  * min(1.0,1.0 * a[1] / (double)a[n]);
    20     printf("%0.3lf",ans);
    21     return 0;
    22 }
  • 相关阅读:
    Android 2.2 r1 API 中文文档系列(11) —— RadioButton
    Android API 中文 (15) —— GridView
    Android 中文 API (16) —— AnalogClock
    Android2.2 API 中文文档系列(7) —— ImageButton
    Android2.2 API 中文文档系列(6) —— ImageView
    Android 2.2 r1 API 中文文档系列(12) —— Button
    Android2.2 API 中文文档系列(8) —— QuickContactBadge
    [Android1.5]TextView跑马灯效果
    [Android1.5]ActivityManager: [1] Killed am start n
    Android API 中文(14) —— ViewStub
  • 原文地址:https://www.cnblogs.com/rax-/p/9937006.html
Copyright © 2011-2022 走看看