AtCoder Beginner Contest 270 EX(期望)

题意:n个数ai,和n个计数器ci(初始都为0),每次等概率选一个计数器置0,其他计数器+1,求所有计数器变成ai的期望次数。(a1=0,n<=2e5,ai<=1e18,ai数组不减)
Solution:
\quad 设置一个状态 s t a t e = m a x ( a i − c i ) state = max(a_i-c_i) state=max(aici),当state = 0时就结束了,初始state = a n a_n an
\quad E k E_k Ek表示state=k时到达state=0的期望次数。每次操作将某个 a i − c i a_i-c_i aici变成 a i a_i ai,state变成 m a x ( a i , a j − c j − 1 ) , j ≠ i max(a_i,a_j-c_j-1),j\neq i max(ai,ajcj1),j=i
state=k时,如果选择 a i < k a_i<k ai<k去置0,则state不变。
如果选择ai>=k去置0,则state = k-> state = a i a_i ai
a r < k < = a r + 1 a_r<k<=a_{r+1} ar<k<=ar+1(即最大的ai,小于k),有 E k = 1 + 1 n ( r E k − 1 + ∑ j = r + 1 n E a j ) = > E k − 1 = 1 r ( n ( E k − 1 ) − ∑ j = r + 1 n E a j ) E_k =1+\frac{1}{n}(rE_{k-1}+\sum_{j=r+1}^n E_{a_j})=>E_{k-1} = \frac{1}{r}(n(E_k-1)-\sum_{j=r+1}^n E_{a_j}) Ek=1+n1(rEk1+j=r+1nEaj)=>Ek1=r1(n(Ek1)j=r+1nEaj)
然后我们已知 E 0 = 0 , 要求 E a n E_0=0,要求E_{a_n} E0=0,要求Ean,而这个递推式的顺序是反的。改写一下
T k = E a n − E k T_k = E_{a_n}-E_k Tk=EanEk,已知 T a n = 0 要求 T_{a_n}=0要求 Tan=0要求 T 0 T_0 T0

E a n − E k − 1 = E a n − 1 r ( n ( E k − 1 ) − ∑ j = r + 1 n E a j ) = T k − 1 = 1 r ( n ( T k + 1 ) − ∑ j = r + 1 n T a j ) , a r < k < = a r + 1 E_{a_n}-E_{k-1} =E_{a_n}- \frac{1}{r}(n(E_k-1)-\sum_{j=r+1}^n E_{a_j})=\\ T_{k-1}=\frac{1}{r}(n(T_k+1)-\sum_{j=r+1}^n T_{a_j}),a_r<k<=a_{r+1} EanEk1=Eanr1(n(Ek1)j=r+1nEaj)=Tk1=r1(n(Tk+1)j=r+1nTaj),ar<k<=ar+1
现在就可以倒着推了。
式子后面的 ∑ j = r + 1 n T a j \sum_{j=r+1}^n T_{a_j} j=r+1nTaj,对于一些k是不会变的,也就是说只会变n-1次,所以可以看作常数,然后枚举这段变化。

s = ∑ j = r + 1 n T a j , a r < k < = a r + 1 s =\sum_{j=r+1}^n T_{a_j},a_r<k<=a_{r+1} s=j=r+1nTaj,ar<k<=ar+1
上式 = T k − 1 = 1 r ( n ( T k + 1 ) − s ) = n r T k + n − s r T_{k-1}=\frac{1}{r}(n(T_k+1)-s)=\frac{n}{r}T_k+\frac{n-s}{r} Tk1=r1(n(Tk+1)s)=rnTk+rns

这里有个trick,当递推式是 f ( i ) = A ∗ f ( i − 1 ) + B ,可以改写成 f ( i ) + D = A i − j ( f ( j ) + D ) ,其中 D = B A − 1 且 A ≠ 1 f(i) = A*f(i-1)+B,可以改写成f(i)+D = A^{i-j}(f(j)+D),其中D=\frac{B}{A-1}且A\neq1 f(i)=Af(i1)+B,可以改写成f(i)+D=Aij(f(j)+D),其中D=A1BA=1

这里 D = n − s n − r ,且 A 不会为 0 D=\frac{n-s}{n-r},且A不会为0 D=nrns,且A不会为0
T a r + D = ( n r ) i − j ( T a r + 1 + D ) = > T a r = ( n r ) i − j ( T a r + 1 + D ) − D T_{a_r}+D=(\frac{n}{r})^{i-j}(T_{a_{r+1}}+D)=>T_{a_r}=(\frac{n}{r})^{i-j}(T_{a_{r+1}}+D)-D Tar+D=(rn)ij(Tar+1+D)=>Tar=(rn)ij(Tar+1+D)D,
递推的时候每次更新 s − > s + T a j , 其中 s a n = 0 , T a n = 0 s->s+T_{a_j},其中s_{a_n}=0,T_{a_n}=0 s>s+Taj,其中san=0,Tan=0

c神说可以直接设 f k f_k fk表示第一次到达state=k的期望次数,然后可以直接得到上面T式子,似乎是用了期望的可加性,想了好久还不是很懂这个第一次的概念orz,QAQ

#define int long long
const int N=2e5+10;
const int mod=998244353;
const double eps=1e-8;
int n;
int a[N];
ll qsm(int a,int b){
    ll ans = 1,tmp = a;
    while( b ){
        if( b&1 ) ans = ans * tmp%mod;
        tmp = tmp * tmp%mod;
        b>>=1;
    }
    return ans;
}
int ni(int x){return qsm(x,mod-2);}
signed main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif  
    IOS;
    cin>>n;
    _for(i,1,n) cin>>a[i];
    int sr = 0 , E = 0;
    _rep(i,n-1,1){
        int r = i;
        int t = n *ni(r)%mod;
        int A = qsm(t,a[i+1] - a[i])%mod;
        int B = (n - sr + mod)%mod * ni(n-r+mod)%mod; 
        E = A * (E + B)%mod - B + mod;
        E %= mod;
        sr = ( sr + E )%mod;
    }
    cout<<E<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值