zoukankan      html  css  js  c++  java
  • BZOJ2554 Color 和 CF1349D Slime and Biscuits

    Color

    (n)个球排成一列,每个球都有一个颜色,用A~Z的大写字母来表示。我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色。求期望操作多少次,才能使得所有球的颜色都一样?

    对于100%的数据,(n leq 10000)

    题解

    首先确定如何算答案。

    [ ext{ans}=sum_{c= extsf{'A'}}^{ extsf{'Z'}}E( ext{cnt}_c)P( ext{cnt}_c) ]

    我们对每种颜色分开考虑,假设我们正在考虑颜色(c)。那么我们要求的是以这种颜色作为结束状态时的期望步数乘上以这种颜色作为结束状态时概率。

    在我们对(c)单独考虑的时候,其他颜色是等价的,所以影响结果的只有(c)的个数。并且如果结束状态最终不是(c)的时候,我们认为它对答案的贡献是(0)。可以证明这样计算是不重不漏的。

    第一部分

    定义(P(i))表示当前颜色的球有(i)个时,以当前颜色作为结束状态的概率。

    显然(P(0)=0,P(n)=1)

    如果需要更严谨的表达,那么(P)的下标应该还要带上(n)

    考虑这一步选择的球的情况,那么

    [P(i)=frac{(i(i-1)+(n-i)(n-i-1))}{n(n-1)}P(i)+frac{i(n-i)}{n(n-1)}P(i-1)+frac{(n-i)i}{n(n-1)}P(i+1) ]

    [P(i)=frac{P(i+1)+P(i-1)}{2} ]

    那么(P)是一个等差数列。由(P(0)=0,P(n)=1)可得公差为(frac{1}{n}),所以(P(i)=frac{i}{n})

    第二部分

    仍然考虑这一步选择的球的情况

    [E(i)P(i)=frac{(i(i-1)+(n-i)(n-i-1))}{n(n-1)}E(i)P(i)+frac{(n-i)i}{n(n-1)}E(i+1)P(i+1)+frac{i(n-i)}{n(n-1)}E(i-1)P(i-1)+P(i) ]

    这里后面加的(P(i))便是这题与其它题的差异的主要体现。因为我们只计算以当前颜色作为结束状态时的贡献,所以如果这一步的选择不能到达,那么这一步便不计入贡献。

    [E(i)P(i)=frac{E(i+1)P(i+1)+E(i-1)P(i-1)}{2}+frac{P(i)n(n-1)}{2i(n-i)}\ =frac{E(i+1)P(i+1)+E(i-1)P(i-1)}{2}+frac{n-1}{2(n-i)} ]

    为了方便,令(F(i)=E(i)P(i)),那么我们的目标就是要求出这个数组。

    [F(i)=frac{F(i+1)+F(i-1)}{2}+frac{n-1}{2(n-i)} ]

    [F(i+1)=2F(i)-F(i-1)-frac{n-1}{n-i} ]

    注意这个递推式的形式。如果我们能够求出(F(1)),那么整个数组就可以推出来了。关键是要利用好 (F(0)=F(n)=0)的性质。

    考试的时候你就应该开始二分(F(1))的值让它满足条件,然后找规律。

    UPD:应该手动高斯消元……

    如果你经验丰富,那么就应该早已看出递推式的另一种方便求和的形式了。

    [F(i+1)-F(i)=F(i)-F(i-1)-frac{n-1}{n-i} ]

    (Delta=F(1)-F(0)),那么

    [F(i)=F(0)+iDelta-(i-1)frac{n-1}{n-1}-(i-2)frac{n-1}{n-2}-dots-(i-(i-1))frac{n-1}{n-(i-1)}\ =F(0)+iDelta-(n-1)left(i-1-frac{n-i}{n-1}-frac{n-i}{n-2}-dots-frac{n-i}{n-(i-1)} ight)\ =F(0)+iDelta-(n-1)left(i-1-(n-i)sum_{j=1}^{i-1}frac{1}{n-j} ight) ]

    带入(n)可得

    [F(n)=F(0)+nDelta-(n-1)(n-1) ]

    [Delta=frac{(n-1)^2}{n} ]

    所以(F(1)=frac{(n-1)^2}{n}),那么这个题就做完了。时间复杂度(O(n))

    CO int N=10000+10;
    char str[N];
    int cnt[26];
    LD F[N];
    
    int main(){
    	scanf("%s",str+1);
    	int n=strlen(str+1);
    	for(int i=1;i<=n;++i) ++cnt[str[i]-'A'];
    	F[0]=0,F[1]=(LD)(n-1)*(n-1)/n;
    	for(int i=2;i<=n;++i) F[i]=2*F[i-1]-F[i-2]-(LD)(n-1)/(n-i+1);
    	LD ans=0;
    	for(int i=0;i<26;++i) ans+=F[cnt[i]];
    	printf("%.1Lf
    ",ans);
    	return 0;
    }
    

    Slime and Biscuits

    Slime and his (n) friends are at a party. Slime has designed a game for his friends to play.

    At the beginning of the game, the (i)-th player has (a_i) biscuits. At each second, Slime will choose a biscuit randomly uniformly among all (a_1 + a_2 + ldots + a_n) biscuits, and the owner of this biscuit will give it to a random uniform player among (n-1) players except himself. The game stops when one person will have all the biscuits.

    As the host of the party, Slime wants to know the expected value of the time that the game will last, to hold the next activity on time.

    For convenience, as the answer can be represented as a rational number (frac{p}{q}) for coprime (p) and (q), you need to find the value of ((p cdot q^{-1})mod 998\,244\,353). You can prove that (qmod 998\,244\,353 eq 0).

    (2le nle 100\,000,1le a_1+a_2+dots+a_nle 300\,000).

    题解

    类似BZOJ2554 Color,我们对每个人分开考虑,求每个人取满饼干的期望时间与取满饼干的概率的乘积的和。

    [ ext{ans}=sum_{i=1}^nE(a_i)P(a_i) ]

    (sigma=sum_{i=1}^n a_i),那么有转移

    [P(x)=frac{x}{sigma}P(x-1)+frac{sigma-x}{sigma}(frac{n-2}{n-1}P(x)+frac{1}{n-1}P(x+1)) ]

    [E(x)P(x)=frac{x}{sigma}E(x-1)P(x-1)+frac{sigma-x}{sigma}(frac{n-2}{n-1}E(x)P(x)+frac{1}{n-1}E(x+1)P(x+1))+P(x) ]

    然后带入(P(0)=0,P(sigma)=1,E(0)P(0)=0,E(sigma)P(sigma)=0),你就会发现过不了样例。

    因为这题即使一个人饼干没了,别人还是可以分给他饼干。所以(P(0) eq 0,E(0)P(0) eq 0)

    https://codeforces.com/blog/entry/77284

    (E'(x))为一个人有(x)块饼干时,取满饼干的期望时间(其他人取满不结束)。

    [forall kin [1,n],~sum_{i=1}^nE(a_i)P(a_i)=E'(a_k)-E'(0)sum_{i=1,i eq k}^n P(a_i) ]

    这个式子的意思是减去冗余的时间。

    对于(kin [1,n]),对这个等式的两侧分别求和得到

    [nsum_{i=1}^nE(a_i)P(a_i)=sum_{i=1}^nE'(a_i)-E'(0)(n-1)sum_{i=1}^nP(a_i) ]

    因为( ext{ans}=sum_{i=1}^nE(a_i)P(a_i),sum_{i=1}^nP(a_i)=1),所以

    [ncdot ext{ans}=sum_{i=1}^nE'(a_i)-E'(0)(n-1) ]

    容易写出(E')的转移

    [E'(x)=frac{x}{sigma}E'(x-1)+frac{sigma-x}{sigma}(frac{n-2}{n-1}E'(x)+frac{1}{n-1}E'(x+1))+1 ]

    带入(E'(sigma)=0)即可。时间复杂度(O(nlog 998244353))

    CO int N=3e5+10;
    int a[N],E[N][4];
    
    int main(){
    	int n=read<int>(),s=0;
    	for(int i=1;i<=n;++i) s+=read(a[i]);
    	int is=fpow(s,mod-2),in=fpow(n-1,mod-2);
    	for(int x=0;x<=s-1;++x){
    		E[x][0]=mod-mul(x,is);
    		E[x][1]=1+mod-mul(mul(s-x,is),mul(n-2,in));
    		E[x][2]=mod-mul(mul(s-x,is),in);
    		E[x][3]=1;
    	}
    	E[s-1][2]=0;
    	for(int x=0;x<=s-2;++x){
    		int c=mul(mod-E[x+1][0],fpow(E[x][1],mod-2));
    		E[x+1][0]=add(E[x+1][0],mul(E[x][1],c));
    		E[x+1][1]=add(E[x+1][1],mul(E[x][2],c));
    		E[x+1][3]=add(E[x+1][3],mul(E[x][3],c));
    	}
    	E[s-1][3]=mul(E[s-1][3],fpow(E[s-1][1],mod-2)),E[s-1][1]=1;
    	for(int x=s-2;x>=0;--x){
    		E[x][3]=add(E[x][3],mul(E[x+1][3],mod-E[x][2])),E[x][2]=0;
    		E[x][3]=mul(E[x][3],fpow(E[x][1],mod-2)),E[x][1]=1;
    	}
    	int ans=0;
    	for(int i=1;i<=n;++i) ans=add(ans,E[a[i]][3]);
    	ans=add(ans,mod-mul(E[0][3],n-1));
    	ans=mul(ans,fpow(n,mod-2));
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    dedecms自定义表单提交获取时间跟ip地址
    JQuery购物车多物品数量的加减+总价计算
    jquery手机触屏滑动拼音字母城市选择器代码
    js实现图片上传实时显示
    js实现发送验证码倒计时效果
    JS 仿支付宝input文本输入框放大组件
    js实现倒计时效果
    jquery统计输入文字的个数并对其进行判断
    【Linux】Linux系统安全设置
    java泛型(generics)
  • 原文地址:https://www.cnblogs.com/autoint/p/11771992.html
Copyright © 2011-2022 走看看