zoukankan      html  css  js  c++  java
  • loj2541 「PKUWC2018」猎人杀

    https://loj.ac/problem/2541

    自己是有多菜啊,10天前做的题,当时还是看了题解,还让NicoDafaGood同学给我讲了一下。

    而我现在忘得一干二净,一点都想不起来了……

    主要是当时听懂了就打了,没有总结啊。

    我们发现,我们设集合$A$的$w$之和是$S_A$

    那么一个集合$A$在1之后死的概率是$frac{w_1}{S_A+w_1}$。

    为什么呢。

    虽然每次选下一个会死的人,是从没死的人中选,但是实际上,也可以是所有人中选,如果选到了死了的人就继续选。

    记得很久以前谁讲过,其实这道题,换一种说法是,

    一个序列,有$w_i$个$i$,把这一共$sum w$个数随机排列,第$i$个人死的时候是$i$序列里第一次出现的位置。

    问第一个人最后死的概率。

    或许有点抽象,我们换成数学方式来说:

    设$P_i$是下一个死的是第$i$个人的概率

    那么$P_i=frac{w_i}{sum w-S_D}$,其中$D$是死了的人的集合。

    令$A=sum w,B=S_D$,

    把式子变换一下,我们可以得到$P_i=frac{B}{A} P_i + frac{w_i}{A}$,

    就是说有$frac{B}{A}$的可能,我们这次做完之后$i$还没死,相当于我们攻击到了已死的人。

    那么集合$A$都在1之后死的概率这样算:

    egin{aligned}
    P &= sumlimits_{i = 0}^{infty} (1 - frac{S_A + w_1}{sum w})^{i} frac{w_1}{sum w} \
    &= frac{w_1}{sum w}sumlimits_{i = 0}^{infty} (1 - frac{S_A + w_1}{sum w})^{i} \
    &= frac{w_1}{sum w} imes frac{1}{1 - 1 + frac{S_A + w_1}{sum w}} \
    &= frac{w_1}{S_A + w_1}
    end{aligned}

    接下来我们就需要枚举在1死之后的人的集合的$S$,就是$w$和,然后容斥。

    用分治NTT就可以了。

    诶,差点又忘了总结。

    主要是,算1是最后死的概率不好算,但是算一个人是在一个集合中最先死的概率好算。

    很容易想到容斥一下,然后做背包这玩意可以用NTT,维护一个堆,每次用最小的那两个合并

    然后我们发现$sum w$很小,也非常让人舒服。

    //Serene
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    #include<vector>
    #include<set>
    using namespace std;
    #define ll long long
    #define db double
    #define For(i,a,b) for(int i=(a);i<=(b);++i)
    #define Rep(i,a,b) for(int i=(a);i>=(b);--i)
    const int maxn=1e6+7;
    const ll mod=998244353,PR=3;
    ll n,w[maxn],A[maxn],B[maxn],len,l;
    
    char cc;ll ff;
    template<typename T>void read(T& aa) {
    	aa=0;cc=getchar();ff=1;
    	while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
    	if(cc=='-') ff=-1,cc=getchar();
    	while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
    	aa*=ff;
    }
    
    vector<ll> o;
    
    struct Node{
    	int len; vector<ll> P;
    	Node(int len,vector<ll> P):len(len),P(P){}
    	bool operator < (const Node& b) const{return len<b.len;}
    };
    
    multiset<Node> G;
    multiset<Node>::iterator it1,it2;
    
    ll qp(ll x,ll k) {
    	ll rs=1;
    	while(k) {
    		if(k&1) rs=rs*x%mod;
    		k>>=1; x=x*x%mod;
    	}
    	return rs;
    }
    
    ll finv(ll x) {return qp(x,mod-2);}
    
    ll qp1(ll x,ll k) {
    	if(k<0) return qp(finv(x),-k);
    	return qp(x,k);
    }
    
    void Rader(ll F[],ll len) {
    	for(int i=1,j=len/2,k;i<len-1;++i) {
    		if(i<j) swap(F[i],F[j]);
    		k=len>>1;
    		while(j>=k) {j-=k;k>>=1;}
    		if(j<k) j+=k;
    	}
    }
    
    void FFT(ll F[],ll len,ll on) {
    	Rader(F,len);
    	for(int h=2;h<=len;h<<=1) {
    		ll wn=qp1(PR,(mod-1)*on/h);
    		for(int j=0;j<len;j+=h) {
    			ll w=1;
    			for(int i=j;i<j+h/2;++i) {
    				ll u=F[i],v=F[i+h/2]*w%mod;
    				F[i]=(u+v)%mod;
    				F[i+h/2]=(u-v+mod)%mod;
    				w=w*wn%mod;
    			}
    		}
    	}
    	ll x=finv(len);
    	if(on==-1) For(i,0,len) F[i]=F[i]*x%mod;
    }
    
    int main() {
    	read(n); 
    	For(i,1,n) read(w[i]),w[0]+=w[i];
    	For(i,2,n) {
    		o.clear(); o.push_back(1);
    		For(j,1,w[i]-1) o.push_back(0);
    		o.push_back(mod-1);
    		G.insert(Node(w[i],o));
    	}
    	while(G.size()>1) {
    		it1=it2=G.begin(); ++it2;
    		l=it1->len+it2->len;
    		for(len=1;len<=l;len<<=1);
    		For(i,0,it1->len) A[i]=it1->P[i];
    		For(i,0,it2->len) B[i]=it2->P[i];
    		G.erase(G.begin()); G.erase(G.begin());
    		FFT(A,len,1); FFT(B,len,1);
    		For(i,0,len) A[i]=A[i]*B[i]%mod;
    		FFT(A,len,-1);
    		o.clear(); o.reserve(l+1);
    		o.assign(&A[0],&A[l+1]);
    		G.insert(Node(l,o));
    		For(i,0,len) A[i]=B[i]=0;
    	}
    	ll ans=0; it1=G.begin();
    	For(i,0,w[0]-w[1]) ans+=w[1]*finv(i+w[1])%mod*it1->P[i]%mod;
    	printf("%lld
    ",ans%mod);
    	return 0;
    }
    
  • 相关阅读:
    bzoj3105: [cqoi2013]新Nim游戏
    bzoj2142: 礼物
    bzoj3295: [Cqoi2011]动态逆序对
    THUWC2018酱油记
    hdu5306 Gorgeous Sequence
    高斯消元入门
    bzoj3667: RabinMiller算法
    关于wordpress忘记密码 找回密码的方式
    数据库事务四个特性
    mysql的账户失效,之前的密码无法登录
  • 原文地址:https://www.cnblogs.com/Serene-shixinyi/p/9210599.html
Copyright © 2011-2022 走看看