这是第100篇博客,所以肯定是要水过去的。

首先看到这种形式的东西首先min-max容斥一波,设\(f_{c,s}\)表示在\(c\)只咕咕中,经过\(s\)秒之后并没有喂饱任何一只的概率。

\[\begin{aligned}
Ans&=\sum_{i=1}^n(-1)^{i-1}\binom{n}{i}ans_i \\
ans_c&=\sum_{i\ge 1}\sum_{s=0}^i\binom{i}{s}(\frac{n-c}{n})^{i-s}(\frac{c}{n})^sf_{c,s} \\
&=\sum_{s=0}^{c(k-1)}f_{c,s}(\frac{c}{n})^s\sum_{i\ge 0}\binom{i+s}{s}(\frac{n-c}{n})^i \\
&=\frac{n}{c}\sum_{s=0}^{c(k-1)}f_{c,s}
\end{aligned}
\]

现在要求\(f_{c,s}\),转换为方案数之后求它的EGF\(f_c(x)\)。则\(f_c(x)=(\sum_{i=0}^k\frac{x^i}{i!})^c\).用NTT直接做就可以做到\(O(n^2k\log k)\),但是还有更快的方式。

\[\begin{aligned}
f(x)&=1+x+\frac{x^2}{2!}+\ldots+\frac{x^k}{k!} \\
f'(x)&=f(x)-\frac{x^k}{k!} \\
f'_c(x)&=cf_{c-1}(x)(f(x)-\frac{x^k}{k!}) \\
&=c(f_c(x)-\frac{x^k}{k!}f_{c-1}(x)) \\
f_{c,s+1}&=\frac{c}{s+1}(f_{c,s}-\frac{1}{k!}f_{c-1,s-k})
\end{aligned}
\]

(按照对应系数列出递推式)

然后把\(f_{c,s}\)乘上\(\frac{1}{c^s}\)就可以得到概率了。

#include<bits/stdc++.h>
#define Rint register int
using namespace std;
const int N = 55555, mod = 998244353;
namespace MY {
#define pii pair<int,int>
#define fir first
#define sec second
#define MP make_pair
#define For(i,x,y) for (int i=(x);i<=(y);i++)
#define Rof(i,x,y) for (int i=(x);i>=(y);i--)
#define go(x) for (int i=head[x];i;i=edge[i].nxt)
#define templ template<typename T>
typedef long long LL;
inline int rand(){
static int seed = 20050915;
return (((seed * 19260817ll % 2147483647) + 1000000007) % 2147483647) ^ 998244353;
}
templ inline bool chkmin(T &a, T b){return a < b ? a = b, 1 : 0;}
templ inline bool chkmax(T &a, T b){return a > b ? a = b, 1 : 0;}
templ inline void read(T &x){
int ch = getchar();
bool flag = false;
double d = 1;
while((ch < '0' || ch > '9') && ch != '-') ch = getchar();
if(ch == '-'){
flag = true;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
if(ch == '.'){
ch = getchar();
while(ch >= '0' && ch <= '9'){
d *= 0.1;
x += d * (ch - '0');
ch = getchar();
}
}
if(flag) x = -x;
}
inline void upd(int &a, int b, int p = mod){a += b; if(a >= p) a -= p;}
inline int add(int a, int b, int p = mod){int res = a + b; if(res >= p) res -= p; return res;}
inline int dec(int a, int b, int p = mod){int res = a - b; if(res < 0) res += p; return res;}
inline int kasumi(int a, int b, int p = mod){
int res = 1;
while(b){
if(b & 1) res = (LL) res * a % mod;
a = (LL) a * a % mod;
b >>= 1;
}
return res;
}
}
using namespace MY;
int n, k, f[53][N], fac[N], inv[N], res;
inline void init(int m){
fac[0] = 1;
for(Rint i = 1;i <= m;i ++) fac[i] = (LL) fac[i - 1] * i % mod;
inv[m] = kasumi(fac[m], mod - 2);
for(Rint i = m;i;i --) inv[i - 1] = (LL) inv[i] * i % mod;
}
inline int C(int n, int m){return (LL) fac[n] * inv[m] % mod * inv[n - m] % mod;}
int main(){
scanf("%d%d", &n, &k); init(n * k + 5);
f[0][0] = 1;
For(i, 0, k - 1) f[1][i] = inv[i];
For(i, 2, n){
f[i][0] = 1;
For(j, 0, i * (k - 1) - 1)
f[i][j + 1] = (LL) i * inv[j + 1] % mod * fac[j] % mod *
dec(f[i][j], (j >= k - 1) ? ((LL) inv[k - 1] * f[i - 1][j - k + 1] % mod) : 0) % mod;
}
For(i, 1, n){
int tmp = 0, ttt = 1;
For(j, 0, i * (k - 1)){
upd(tmp, (LL) f[i][j] * fac[j] % mod * ttt % mod);
ttt = (LL) ttt * inv[i] % mod * fac[i - 1] % mod;
}
tmp = (LL) tmp * inv[i] % mod * fac[i - 1] % mod * C(n, i) % mod;
if(i & 1) upd(res, tmp); else upd(res, mod - tmp);
}
printf("%d", (LL) res * n % mod);
}

(实际上是为了熟悉一下头文件来写的代码)

UOJ 449 【集训队作业2018】喂鸽子 【生成函数,min-max容斥】的更多相关文章

  1. UOJ 422 [集训队作业2018] 小Z的礼物 min-max容斥 期望 轮廓线dp

    LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...

  2. uoj #450[集训队作业2018]复读机

    传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...

  3. UOJ #449. 【集训队作业2018】喂鸽子

    UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...

  4. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  5. uoj450 【集训队作业2018】复读机(生成函数,单位根反演)

    uoj450 [集训队作业2018]复读机(生成函数,单位根反演) uoj 题解时间 首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] ...

  6. 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

    [UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...

  7. UOJ#418. 【集训队作业2018】三角形

    #418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...

  8. UOJ#422. 【集训队作业2018】小Z的礼物

    #422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...

  9. UOJ#428. 【集训队作业2018】普通的计数题

    #428. [集训队作业2018]普通的计数题 模型转化好题 所以变成统计有标号合法的树的个数. 合法限制: 1.根标号比子树都大 2.如果儿子全是叶子,数量B中有 3.如果存在一个儿子不是叶子,数量 ...

  10. [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥

    题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...

随机推荐

  1. PB笔记之第一行数据不能删除的解决方法

    如果第一行数据不能删除,则单独写SQL进行删除 window lw_sheet //dw_1.event pfc_deleterow()long i String ls_manidInteger ls ...

  2. windows主机上ORACLE生成awr报告的步骤

    oracle数据库是一个大型的关系型数据库,那么如果有一天装载数据库的主机由于大量的IO操作导致主机cpu荷载超过100%会使得主机卡顿或者对数据库连接或者进行数据库进行正常的IO操作都会产生影响,所 ...

  3. FPS 游戏实现D3D透视

    FPS游戏可以说一直都比较热门,典型的代表有反恐精英,穿越火线,绝地求生等,基本上只要是FPS游戏都会有透视挂的存在,而透视挂还分为很多种类型,常见的有D3D透视,方框透视,还有一些比较高端的显卡透视 ...

  4. Git config 使用说明(转)

    原文:https://blog.csdn.net/gdutxiaoxu/article/details/79253737

  5. ffmpeg 播放器原理

    1  播放器过程 线程1 : readPackets-------> audio_packets队列   video packets 队列 线程2: decodeAudio && ...

  6. 十年感悟之 python之路

    本文由 简悦 SimpRead 转码, 原文地址 https://laisky.com/p/python-road/ Changelog: updated at 2019/9/6 一.概述 本文起源于 ...

  7. Vue组件component创建及使用

    组件化与模块化的区别 什么是组件:组件的出现,就是为了拆分Vue实例的代码量,能够让我们以不同的组件,来划分不同的功能模块 ,将来我们需要什么功能,就可以去调用对应的组件即可 组件化与模块化的不同: ...

  8. 记一次SQL PLUS 不能登录的异常处理

    记一次SQL PLUS 不能登录的异常处理 现象 通过远程PLSQL Developer 访问数据发现卡死没响应. 通过Sqlplus 访问数据同样hang死在登录界面,且不能通过Ctrl+C取消 [ ...

  9. Windows Server 2008上网设置——IE

    IE安装设置 在 Windows Sever 2008 中打开 IE 浏览器时,IE 会出现[已启用 Internet Explorer 增强的安全配置]的提示信息. Windows Server 2 ...

  10. Pyspark笔记一

    1. pyspark读csv文件后无法显示中文 #pyspark读取csv格式时,不能显示中文 df = spark.read.csv(r"hdfs://mymaster:8020/user ...