• 【codeforces.com/gym/100240 J】


    http://codeforces.com/gym/100240 J


    【分析】

      这题我搞了好久才搞出样例的11.76。。。。【期望没学好

      然后好不容易弄成分数形式。然后我‘+’没打。。【于是爆0。。。

      好桑心。。

      对于x^2这样的期望,是不能直接求x的期望然后平方的!

      为什么呢?因为意义就是不对的,你的概率有可能乘了两次什么的。。。

      我的方法是:

      先把每天分离出来,对于某一天,假设你前i部番的x^2的期望求了出来,然后新的一部翻在这天放的概率是p,

      新的答案就是$x^{2}*(1-p)+p*(x+1)^2$

      即$x^{2}+p*(2*x+1)$

      这样就可以求了。【实测是对的啊!!

      所以你还要维护x的期望【这个很容易的啦。

      然后你会发现,你的分数是a/(n^2)+b/n,这种形式的,a很小不会超过n,我就用两个东西来存这两个分子。

      每超过分母就把它加进整数部分,这样用long long就不会爆了。

      对于n很大,发现d<=10000,dmx~n这一段的期望其实是完全一样的,所以只需要求1~dmx就好了。

      如果d也很大的话,还可以把d离散,中间的点的期望跟前面最近的点的期望是一样的。

      男神的方法好像有点不一样?但是我觉得这个更容易想啊!

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 #define Maxn 10010
     8 #define LL long long
     9 
    10 int b[110][110];
    11 LL d[Maxn],c[Maxn];
    12 int mymax(LL x,LL y) {return x>y?x:y;}
    13 
    14 struct node
    15 {
    16     LL x,y,z;
    17 }A[Maxn];
    18 
    19 LL gcd(LL a,LL b)
    20 {
    21     if(b==0) return a;
    22     return gcd(b,a%b);
    23 }
    24 
    25 LL n;
    26 void add(LL x,LL a,LL b)
    27 {
    28     A[x].x+=a;A[x].y+=b;
    29     A[x].z+=A[x].x/(n*n);A[x].z+=A[x].y/n;
    30     A[x].x%=(n*n);A[x].y%=n;
    31 }
    32 
    33 int main()
    34 {
    35     int m,mx=0;
    36     scanf("%lld%d",&n,&m);
    37     for(int i=1;i<=m;i++)
    38     {
    39         scanf("%d",&b[i][0]);
    40         for(LL j=1;j<=b[i][0];j++)
    41         {
    42             scanf("%d",&b[i][j]);
    43             mx=mymax(mx,b[i][j]);
    44         }
    45     }
    46     for(int i=0;i<=mx;i++) A[i].x=0,A[i].y=0,A[i].z=0;
    47     for(int i=1;i<=mx;i++) c[i]=0;
    48     for(int i=1;i<=m;i++)
    49     {
    50         for(int j=1;j<=mx;j++) d[j]=0;
    51         for(int j=1;j<=mx;j++)
    52         {
    53             for(int k=1;k<=b[i][0];k++)
    54             {
    55                 if(j+b[i][k]-1>mx) break;
    56                 d[j+b[i][k]-1]++;
    57             }
    58         }
    59         for(int i=1;i<=mx;i++)
    60         {
    61             add(i,d[i]*2*c[i],d[i]);
    62             c[i]+=d[i];
    63         }
    64     }
    65     if(n<=mx)
    66     {
    67         for(int i=1;i<=n;i++)
    68         {
    69             A[0].z+=A[i].z;
    70             add(0,A[i].x,A[i].y);
    71         }
    72     }
    73     else
    74     {
    75         for(int i=1;i<=mx;i++)
    76         {
    77             A[0].z+=A[i].z;
    78             add(0,A[i].x,A[i].y);
    79         }
    80         A[0].z+=(n-mx)*A[mx].z;
    81         add(0,A[mx].x*(n-mx),A[mx].y*(n-mx));
    82     }
    83     A[0].x+=A[0].y*n;
    84     A[0].z+=A[0].x/(n*n);
    85     A[0].x%=(n*n);
    86     LL g=gcd(A[0].x,n*n);
    87     A[0].x/=g;A[0].y=n*n/g;
    88     printf("%lld+%lld/%lld
    ",A[0].z,A[0].x,A[0].y);
    89     return 0;
    90 }
    View Code

    2017-04-19 10:16:51

  • 相关阅读:
    HDU_1709 The Balence (生成函数)
    Ural_1003 Parity(并查集)
    HDU_1171 Big Event in HDU(生成函数)
    Ural_1306. Sequence Median(堆)
    POJ_2823 Sliding Window(单调队列)
    HDU_2065 "红色病毒"问题(指数型生成函数)
    HDU_2082 找单词 (生成函数)
    最长上升子序列问题(LCS)
    HDU_1284 钱币兑换问题(生成函数)
    HDU_2152 Fruit(生成函数)
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6731971.html
Copyright © 2020-2023  润新知