zoukankan      html  css  js  c++  java
  • [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);
    }
    
  • 相关阅读:
    Objective-C 资源收藏
    坑爹的高德地图API
    nginx的location root alias指令以及区别
    Java Swing 界面中文乱码问题解决(Idea环境)
    不同的国家/地区与语言缩写代码
    IDEA编译时出现 Information:java: javacTask: 源发行版 1.8 需要目标发行版 1.8
    请重视!请重视!请重视!百度熊掌号之搜索资源平台体验
    php7带来的性能升级
    详解Asp.Net Core 2.1+的视图缓存(响应缓存)
    Xshell5 提示要继续使用此程序,您必须应用最新的更新或使用新版本
  • 原文地址:https://www.cnblogs.com/dedicatus545/p/10589998.html
Copyright © 2011-2022 走看看