• [NOI.AC省选模拟赛3.23] 集合 [数学]


    题面

    传送门

    一句话题意:

    给定$nleq 1e9,kleq 1e7,Tleq 1e9$

    设全集$U=lbrace 1,2,3,...n brace $,求$(min_{xin S}lbrace S brace (Ssubseteq U, lvert S vert =k))^T$的期望

    重要思想

    注意,在遇到包含

    思路

    首先,通过枚举$S$集合最小值选取哪个数,可以得到:

    $Ans(k)=sum_{i=1}^n inom{n-i}{k-1} T^i$

    然后,通过枚举$S$集合最小值至少是多少,并且每次累加比上一次还大的可能性,可以得到:

    $Ans(k)=Tinom{n}{k}+sum_{i=1}^{n-1} inom{n-i}{k}T^i(T-1)$

    发现这个式子的后面一部分可以表示成第一个式子:

    $Ans(k)=Tinom{n}{k}+(T-1)Ans(k+1)$

    从$Ans(n)$开始往下累加一下,可以得到:

    $Ans(k)=T(sum_{i=0}{n-k}inom{n}{k+i}(T-1)i)=T(sum_{i=k}ninom{n}{k}(T-1){i-k}$

    这个式子要$O(n-k)$的时间,做不了,考虑怎么把它变成能算的$O(k)$

    考虑二项式定理:$sum_{i=0}^n (T-1)iinom{n}{i}=(T-1+1)n=T^n$

    所以$Ans(k)=frac{T}{(T-1)k}(Tn-sum_{i=0}^{k-1} (T-1)^iinom{n}{i})$

    就可以直接算了

    最后不要忘了除以$inom{n}{k}$,求得是期望

    Code

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cassert>
    #define MOD 998244353
    #define ll long long
    using namespace std;
    inline int read(){
    	int re=0,flag=1;char ch=getchar();
    	while(!isdigit(ch)){
    		if(ch=='-') flag=-1;
    		ch=getchar();
    	}
    	while(isdigit(ch)) re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
    	return re*flag;
    }
    inline int qpow(int a,int b){
    	int re=1;
    	while(b){
    		if(b&1) re=1ll*re*a%MOD;
    		a=1ll*a*a%MOD;b>>=1;
    	}
    	return re;
    }
    int n,k,A;int f[10000010],finv[10000010];
    void init(){
    	int i,len=10000000;
    	f[0]=f[1]=finv[0]=finv[1]=1;
    	for(i=2;i<=len;i++) f[i]=1ll*f[i-1]*i%MOD;
    	finv[len]=qpow(f[len],MOD-2);
    	for(i=len;i>2;i--) finv[i-1]=1ll*finv[i]*i%MOD;
    	for(i=1;i<=k;i++) f[i]=1ll*f[i-1]*(n-i+1)%MOD;
    }
    int C(int x,int y){
    	return 1ll*f[y]*finv[y]%MOD;
    }
    int main(){
    	n=read();k=read();A=read();
    	if(A==1){puts("1");return 0;}
    	init();int i,ans=1ll*A*qpow(qpow(A-1,k),MOD-2)%MOD,tot=qpow(A,n),p=1;
    	for(i=0;i<k;i++){
    		tot=(1ll*tot-1ll*p*C(n,i)%MOD+MOD)%MOD;
    		p=1ll*p*(A-1)%MOD;
    	}
    	printf("%lld
    ",1ll*ans*tot%MOD*qpow(C(n,k),MOD-2)%MOD);
    }
    
  • 相关阅读:
    Java_Habse_add
    Java_Habse_shell
    android Studio 出现:Unable to resolve dependency for ':app@debug/compileClasspath'
    微信小程序云函数中有以下未安装的依赖,如果未安装即全量上传
    Bittorrent Protocol Specification v1.0 中文
    BT客户端实现 Peer协议设计
    NGINX 配置 SSL 双向认证
    openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?
    ssl双向认证和单向认证原理
    网络服务器之HTTPS服务
  • 原文地址:https://www.cnblogs.com/dedicatus545/p/10589998.html
Copyright © 2020-2023  润新知