【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\n",A[0].z,A[0].x,A[0].y);
89     return 0;
90 }
View Code

 

2017-04-19 10:16:51

posted @ 2017-04-19 10:16  konjak魔芋  阅读(195)  评论(0编辑  收藏  举报