Problem

UOJ

看题后:

  • boshi:这是一道简单题
  • 队长:这题好像不难,感觉和猎人杀有点像
  • 我:

Solution

感觉自己越来越菜了,再这样下去,要是正式考试送温暖岂不是连温暖都拿不到了。。

一脸min-max反演的样子,由于每个鸽子都等价,枚举子集大小 iii 即可

ans=∑i=1n(ni)(−1)i+1nif(i)ans=\sum_{i=1}^n\binom n i(-1)^{i+1}\frac n i f(i)ans=i=1∑n​(in​)(−1)i+1in​f(i)

其中 ni\frac n iin​ 来源于平均每 ni\frac n iin​ 步才会有一粒喂给选中的鸽子。f(i)f(i)f(i) 表示的是给 iii 只鸽子喂食,有一个鸽子大于等于 kkk 时停止的期望步数。

枚举喂给其他鸽子的玉米粒数量,概率通过方案数来算

f(i)=∑j=0(i−1)(k−1)(j+k)i(j+k−1j)g[i−1][j](1i)j+kf(i)=\sum_{j=0}^{(i-1)(k-1)} (j+k)i\binom {j+k-1} jg[i-1][j] (\frac 1 i)^{j+k}f(i)=j=0∑(i−1)(k−1)​(j+k)i(jj+k−1​)g[i−1][j](i1​)j+k

其中 g[i−1][j]g[i-1][j]g[i−1][j] 表示给 i−1i-1i−1 只鸽子喂 jjj 粒,且每只都小于 kkk 的方案数。这个可以用生成函数算

g[i−1][j]=(∑r=0k−1xii!)i−1[j]g[i-1][j]=(\sum_{r=0}^{k-1} \frac {x^i} {i!})^{i-1}[j]g[i−1][j]=(r=0∑k−1​i!xi​)i−1[j]

时间复杂度 O(n2klog⁡(nk))O(n^2k\log (nk))O(n2klog(nk))

Code

#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=70010,mod=998244353,G=3;
template <typename Tp> inline int getmin(Tp &x,Tp y){return y<x?x=y,1:0;}
template <typename Tp> inline int getmax(Tp &x,Tp y){return y>x?x=y,1:0;}
template <typename Tp> inline void read(Tp &x)
{x=0;int f=0;char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') f=1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();if(f) x=-x;
}
int n,k,N,l,ans,fac[maxn],inv[maxn],f[55],g[55][maxn],rev[maxn];
int pls(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int dec(int x,int y){return x<y?x-y+mod:x-y;}
int C(int n,int m){return m>n?0:(ll)fac[n]*inv[m]%mod*inv[n-m]%mod;}
int power(int x,int y)
{int res=1;for(;y;y>>=1,x=(ll)x*x%mod)if(y&1)res=(ll)res*x%mod;return res;
}
void NTT(int *a,int f)
{for(int i=1;i<N;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);for(int i=1;i<N;i<<=1){int gn=power(G,(mod-1)/(i<<1));for(int j=0;j<N;j+=(i<<1)){int g=1,x,y;for(int k=0;k<i;++k,g=(ll)g*gn%mod){x=a[j+k];y=(ll)g*a[j+k+i]%mod;a[j+k]=pls(x,y);a[j+k+i]=dec(x,y);}}}if(f==-1){int iv=power(N,mod-2);reverse(a+1,a+N);for(int i=0;i<N;i++) a[i]=(ll)a[i]*iv%mod;}
}
void init(int N)
{fac[0]=1;for(int i=1;i<=N;i++) fac[i]=(ll)fac[i-1]*i%mod;inv[N]=power(fac[N],mod-2);for(int i=N-1;~i;i--) inv[i]=(ll)inv[i+1]*(i+1)%mod;
}
int main()
{read(n);read(k);init(n*k);for(N=1,l=0;N<=(n*k);N<<=1) ++l;for(int i=1;i<N;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));for(int i=0;i<k;i++) g[1][i]=inv[i];NTT(g[1],1);g[0][0]=1;for(int i=2;i<n;i++)for(int j=0;j<N;j++)g[i][j]=(ll)g[i-1][j]*g[1][j]%mod;for(int i=1;i<=1||i<n;i++) NTT(g[i],-1);for(int i=1;i<=n;i++){int inv=power(i,mod-2);int tmp=power(inv,k-1);for(int j=0;j<N;j++,tmp=(ll)tmp*inv%mod)f[i]=(f[i]+(ll)(j+k)*C(j+k-1,j)%mod*g[i-1][j]%mod*fac[j]%mod*tmp)%mod;}for(int i=1;i<=n;i++){if(i&1) ans=(ans+(ll)C(n,i)*n%mod*power(i,mod-2)%mod*f[i])%mod;else ans=dec(ans,(ll)C(n,i)*n%mod*power(i,mod-2)%mod*f[i]%mod)%mod;}printf("%d\n",ans);return 0;
}

UOJ449 集训队作业2018 喂鸽子相关推荐

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

    #449. [集训队作业2018]喂鸽子 DP好题 法一:min-max容斥 处理前m个,最快吃饱的鸽子期望的时间 根据期望的定义 考虑每个方案数的概率*期望次数 枚举前m个用了x个,概率都是(1/m ...

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

    uoj#422. [集训队作业2018]小Z的礼物 题目描述 Solution 所有礼物全部取到的方案数并不好求,因此我们考虑min−maxmin-maxmin−max容斥,转化为第一次取到集合中某一 ...

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

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

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

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

  5. UOJ#449. 【集训队作业2018】喂鸽子 min-max容斥,FFT

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ449.html 题解 设 f(i) 表示给 i 只鸽子喂食使得至少一只鸽子被喂饱的期望次数,先 min-max容斥 一下. ...

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

    我的计数还是太差了-- 这道题现在知道三种做法. 1. 直接DP 首先显然需要min-max容斥(不知道请百度),不然很难算. 显然对于大小相同的集合答案一样,问题转化为求 \(f_c\) 即 \(c ...

  7. 【集训队作业2018】复读机

    即使是一道菜题,也掩盖不了窝生成函数弱的事实. 窝看到题目只想到了DP,还是生成函数不够熟.然后直到神仙WWJ提醒我用生成函数-- 首先是排列,那就可以写成指数型生成函数的优美形式.直接表示成exp吧 ...

  8. 【集训队作业2018】围绕着我们的圆环

    我貌似开始爆OJ了 主要是因为预处理的范围写小,以及第一次写带删除线性基,然后就调了好久/cy 如果把 \(A\) 看做一堆列向量,然后对于 \(C\) 的一个列向量 \(V\) ,以及对应列的 \( ...

  9. 【集训队作业2018】复读机【指数型生成函数】【单位根反演】【二项式定理】

    传送门 单位根反演听着高级,其实没啥技术含量-- 本文是篇几乎没有证明的佛系讲解 单位根反演的式子长这样: 1n∑i=0n−1ωnik=[k∣n]\frac{1}{n}\sum_{i=0}^{n-1} ...

  10. [集训队作业2018] count(笛卡尔树,生成函数,卡特兰数)

    传送门 什么情况下两序列同构 对于两序列A[1,n],B[1,n]A[1,n],B[1,n]A[1,n],B[1,n],设fA(1,n)=pa,fB(1,n)=pbf_A(1,n)=p_a,f_B(1 ...

最新文章

  1. Leangoo敏捷项目管理软件 6.3.2
  2. 凯文·凯利:下一个5000天的12个必然趋势!
  3. 诺基亚基于区块链推环境感知服务,助力智慧城市发展
  4. PHP无限极分类原理
  5. 大学四年, 专业心得
  6. python下标从0开始_从零学Python之入门(三)序列
  7. Flutter进阶—解析动画
  8. 在暂存区域中显示文件中的git diff [复制]
  9. 剑指offer——面试题8:旋转数组的最小数字
  10. Windows下secureCRT、putty使用秘钥登录Linux
  11. 拓端tecdat|Matlab通过市场数据校准Hull-White利率模型参数
  12. px,em,rem单位转换工具
  13. 三菱plc pwm指令_三菱PLC常用指令汇总,含用法与注释
  14. 基于C语言开发的教师管理系统
  15. 投影仪与计算机连接方式,投影仪和电脑怎么连接?简单的图文教程
  16. 运筹优化学习07:Lingo的 @if 函数的使用方法
  17. activeMQ基础学习和SpringBoot整合activeMQ案例
  18. 细数那些年我们一起玩过的Unity3D游戏(unity开发的游戏有哪些)
  19. 检讨书应该怎么写,我来做个示范
  20. 频繁撤单有风险?--这些委托类型让您享受“撤单豁免权”

热门文章

  1. 智慧云教育平台实战项目笔记
  2. 代码粘贴至word后,黑色背景处理
  3. 品牌背后的逻辑到底是什么?
  4. 建立一个电脑网络至少需要两台计算机,两台电脑见建立一个局域网方法介绍
  5. OpenBSD6.3系统安装记录
  6. 地理Essay范文的组成剖析
  7. 在c语言中下列类型属于构造地震,C语言课后习题解析及答案
  8. android 字体外发光,CSS3 霓虹外发光字体效果
  9. 360浏览器打不开微信的连接服务器,360浏览器打不开网页怎么办-解决360浏览器打不开网页的方法 - 河东软件园...
  10. 怎么用html5动画效果,教你如何在网页上用H5实现动画效果