zoukankan      html  css  js  c++  java
  • UOJ449. 【集训队作业2018】喂鸽子

    UOJ449. 【集训队作业2018】喂鸽子

    AGC038E 弱化版?

    Solution

    (min-max) 容斥,现在问题是计算 (mathbb{E}(min S)),首先我们知道集合的大小是无关的,设集合大小为 (i) 我们期望 (frac{n}{i}) 次选中此集合。

    接下来只需要计算期望抽多少次有一个到达 (k) 可以转换为求 (sum P(Xge i)),对于某个 (i) 问题等价于给每个元素分配一个次数使得均小于 (k),此时我们相当于计算 (sum (sum [i<k]frac{x^i}{i!})^m[x^n]cdot n!cdot (frac{1}{m})^n) 的各个系数之和然后乘以 (frac{n}{i}) 即为期望次数了。

    暴力计算 EGF 卷积只能得到 (mathcal O((nk)^2)) 的做法。

    使用 NTT 优化可以做到 (mathcal O(n^2klog (nk)))

    更进一步,万事不决就求导:

    [(F(x)^i)'=i imes F(x)^{i-1} imes F'(x) ]

    注意到 (F'(x)=sum frac{x^i}{i!}[i<k]=F(x)-frac{x^k}{k!})(方便起见给 (k) 先减了 (1)

    于是得到:

    [egin{aligned} &(F(x)^j)'=j imes F(x)^{j-1} imes (F(x)-frac{x^k}{k!}) \&j imes F(x)^j-(F(x)^j)'=jF(x)^{j-1}frac{x^k}{k!} end{aligned}]

    后者是多项式卷单项式,预处理得到 (G(x)),于是我们得到 (j imes f_i-f_{i+1}(i+1)=jcdot g_i),所以得到 (f_{i+1}=(f_i-g_i) imesfrac{j}{(i+1)})

    于是可以 (mathcal O(n^2k)) 的解决此题。

    (Code:)

    #include<bits/stdc++.h>
    using namespace std ;
    #define Next( i, x ) for( register int i = head[x]; i; i = e[i].next )
    #define rep( i, s, t ) for( register int i = (s); i <= (t); ++ i )
    #define drep( i, s, t ) for( register int i = (t); i >= (s); -- i )
    #define re register
    #define mp make_pair
    #define pi pair<int, int>
    #define pb push_back
    #define vi vector<int>
    #define int long long
    int gi() {
    	char cc = getchar() ; int cn = 0, flus = 1 ;
    	while( cc < '0' || cc > '9' ) {  if( cc == '-' ) flus = - flus ; cc = getchar() ; }
    	while( cc >= '0' && cc <= '9' )  cn = cn * 10 + cc - '0', cc = getchar() ;
    	return cn * flus ;
    }
    const int P = 998244353 ; 
    const int N = 5e4 + 5 ; 
    int fpow(int x, int k) {
    	int ans = 1, base = x ;
    	while(k) {
    		if(k & 1) ans = 1ll * ans * base % P ;
    		base = 1ll * base * base % P, k >>= 1 ;
    	} return ans ;
    }
    int n, K, S, inv[N], fac[N], ifac[N], f[N], g[N], bef[N] ; 
    int C(int x, int y) {
    	return fac[x] * ifac[y] % P * ifac[x - y] % P ; 
    }
    signed main()
    {
    	n = gi(), K = gi() - 1, S = n * K, fac[0] = 1 ; 
    	rep( i, 1, max( n, S ) ) inv[i] = fpow( i, P - 2 ), fac[i] = fac[i - 1] * i % P ; 
    	rep( i, 0, max( n, S ) ) ifac[i] = fpow( fac[i], P - 2 ) ; 
    	f[0] = 1 ; int Ans = 0 ; 
    	for(re int i = 1; i <= n; ++ i) {
    		rep( j, 0, S ) bef[j] = g[j], g[j] = 0 ; 
    		rep( j, K, S ) g[j] = f[j - K] * ifac[K] % P ; 
    		f[0] = 1 ; 
    		rep( j, 1, S ) f[j] = (f[j - 1] % P - g[j - 1] + P) * inv[j] % P * i % P ; 
    		int p = inv[i], d = n * inv[i] % P, ans = 0 ; 
    		for(re int j = 0; j <= S; ++ j)
    		ans = (ans + fac[j] * d % P * f[j]) % P, d = d * p % P ; 
    		Ans = (Ans + C(n, i) % P * ((i & 1) ? 1 : P - 1) % P * ans % P) % P ; 
    	}
    	cout << Ans << endl ; 
    	return 0 ;
    }
    
  • 相关阅读:
    微信小程序音频播放
    jsonp跨域请求-最简单的方法
    mysql explain 正常,但是实际上是全盘扫描
    lnmp运行过程中出现502处理方法
    [Python]利用type()动态创建类
    Django-form表单
    Django-认证系统
    Django-model基础
    Django-MTV
    前端基础之:JQuery(可编辑版)
  • 原文地址:https://www.cnblogs.com/Soulist/p/14016922.html
Copyright © 2011-2022 走看看