[集训队作业2018] 复读机(生成函数,单位根反演)
传送门
subtask 1:d=1d=1d=1
答案为knk^nkn。
subtask 2:n≤1000,k≤100n\leq1000,k\leq 100n≤1000,k≤100
设f[i][j]f[i][j]f[i][j]表示由iii个复读机来分jjj个时间点的方案数。
可以得到递推式:
f[i][j]=∑p=0j[d∣p]Cjp×f[i−1][j−p]f[i][j]=\sum_{p=0}^{j}[d|p]C_{j}^{p}\times f[i-1][j-p]f[i][j]=p=0∑j[d∣p]Cjp×f[i−1][j−p]
O(nk2)O(nk^2)O(nk2)暴力DP即可。
subtask 3:d=2d=2d=2
把d=2d=2d=2代入上面的递推式得:
f[i][j]=∑p=0j[2∣p]Cjp×f[i−1][j−p]f[i][j]=\sum_{p=0}^{j}[2|p]C_{j}^{p}\times f[i-1][j-p]f[i][j]=p=0∑j[2∣p]Cjp×f[i−1][j−p]
f[i][j]=∑p=0j[2∣p]j!p!(j−p)!×f[i−1][j−p]f[i][j]=\sum_{p=0}^{j}[2|p]\frac{j!}{p!(j-p)!}\times f[i-1][j-p]f[i][j]=p=0∑j[2∣p]p!(j−p)!j!×f[i−1][j−p]
f[i][j]j!=∑p=0j[2∣p]1p!f[i−1][j−p](j−p)!\frac{f[i][j]}{j!}=\sum_{p=0}^{j}[2|p]\frac{1}{p!}\frac{f[i-1][j-p]}{(j-p)!}j!f[i][j]=p=0∑j[2∣p]p!1(j−p)!f[i−1][j−p]
设Ai(x)=∑j=0∞f[i][j]×xjj!,B(x)=∑j=0∞[2∣j]xjj!A_i(x)=\sum_{j=0}^{\infty}f[i][j]\times\frac{x^j}{j!},B(x)=\sum_{j=0}^{\infty}[2|j]\frac{x^j}{j!}Ai(x)=∑j=0∞f[i][j]×j!xj,B(x)=∑j=0∞[2∣j]j!xj
代入上式得:
Ai(x)[xj]=∑p=0jB(x)[xp]×Ai−1(x)[xj−p]A_i(x)[x^j]=\sum_{p=0}^{j}B(x)[x^p]\times A_{i-1}(x)[x^{j-p}]Ai(x)[xj]=p=0∑jB(x)[xp]×Ai−1(x)[xj−p]
所以Ai(x)=B(x)Ai−1(x)A_i(x)=B(x)A_{i-1}(x)Ai(x)=B(x)Ai−1(x)
又因为A0(x)=1A_0(x)=1A0(x)=1
所以Ai(x)=Bi(x)A_i(x)=B^i(x)Ai(x)=Bi(x)
化简B(x)B(x)B(x):
因为ex=∑j=0∞xjj!,e−x=∑j=0∞(−1)j×xjj!e^x=\sum_{j=0}^{\infty}\frac{x^j}{j!},e^{-x}=\sum_{j=0}^{\infty}(-1)^j\times \frac{x^j}{j!}ex=∑j=0∞j!xj,e−x=∑j=0∞(−1)j×j!xj
所以B(x)=ex+e−x2B(x)=\frac{e^x+e^{-x}}{2}B(x)=2ex+e−x
所以f[k][n]f[k][n]f[k][n](最终答案)为(ex+e−x2)k×n!(\frac{e^x+e^{-x}}{2})^k\times n!(2ex+e−x)k×n!的nnn次项系数。
将上式二项式展开得:n!×12k∑i=0kCki×eix×e(i−k)xn!\times\frac{1}{2^k}\sum_{i=0}^{k}C_{k}^{i}\times e^{ix}\times e^{(i-k)x}n!×2k1i=0∑kCki×eix×e(i−k)x
=n!×12k∑i=0kCki×e(2i−k)x=n!\times\frac{1}{2^k}\sum_{i=0}^{k}C_{k}^{i}\times e^{(2i-k)x}=n!×2k1i=0∑kCki×e(2i−k)x
而e(2i−k)x=∑j=0∞((2i−k)x)jj!e^{(2i-k)x}=\sum_{j=0}^{\infty}\frac{((2i-k)x)^{j}}{j!}e(2i−k)x=∑j=0∞j!((2i−k)x)j,其nnn次项系数为(2i−k)nn!\frac{(2i-k)^n}{n!}n!(2i−k)n
所以最终答案为12k∑i=0kCki×(2i−k)n\frac{1}{2^k}\sum_{i=0}^{k}C_{k}^{i}\times (2i-k)^n2k1i=0∑kCki×(2i−k)n
subtask 4:d=3
同样考虑生成函数,答案就是(∑i=0∞[3∣i]xii!)k×n!(\sum_{i=0}^{\infty}[3|i]\frac{x^i}{i!})^k\times n!(∑i=0∞[3∣i]i!xi)k×n!的nnn次项系数。
有一个trick,叫单位根反演,大概是这样:
[n∣k]=1n∑i=0n−1wnki[n|k]=\frac{1}{n}\sum_{i=0}^{n-1}w_{n}^{ki}[n∣k]=n1i=0∑n−1wnki
注意到19491001−119491001-119491001−1是3的倍数 ,即mod−1mod-1mod−1是3的倍数,故存在三次单位根rrr。由单位根的定义知,r=Rmod−13r=R^{\frac{mod-1}{3}}r=R3mod−1 ,其中RRR是modmodmod的一个原根。运用单位根反演,有:
∑i=0∞[3∣i]xii!=13∑i=0∞(r0+ri+r2i)xii!=ex+erx+er2x3\sum_{i=0}^{\infty}[3|i]\frac{x^i}{i!}=\frac{1}{3}\sum_{i=0}^{\infty}\frac{(r^0+r^{i}+r^{2i})x^i}{i!}=\frac{e^x+e^{rx}+e^{r^2x}}{3}i=0∑∞[3∣i]i!xi=31i=0∑∞i!(r0+ri+r2i)xi=3ex+erx+er2x
所以答案就是(ex+erx+er2x3)k×n!(\frac{e^x+e^{rx}+e^{r^2x}}{3})^k\times n!(3ex+erx+er2x)k×n!的nnn次项系数。
将上式大力展开得:
n!×13k∑i=0k∑j=0k−iCki×Ck−ij×eix×ejrx×e(k−i−j)r2xn!\times\frac{1}{3^k}\sum_{i=0}^{k}\sum_{j=0}^{k-i}C_{k}^{i}\times C_{k-i}^{j}\times e^{ix}\times e^{jrx}\times e^{(k-i-j)r^2x}n!×3k1i=0∑kj=0∑k−iCki×Ck−ij×eix×ejrx×e(k−i−j)r2x
=n!×13k∑i=0k∑j=0k−iCki×Ck−ij×e(i+jr+(k−i−j)r2)x=n!\times\frac{1}{3^k}\sum_{i=0}^{k}\sum_{j=0}^{k-i}C_{k}^{i}\times C_{k-i}^{j}\times e^{(i+jr+(k-i-j)r^2)x}=n!×3k1i=0∑kj=0∑k−iCki×Ck−ij×e(i+jr+(k−i−j)r2)x
e(i+jr+(k−i−j)r2)xe^{(i+jr+(k-i-j)r^2)x}e(i+jr+(k−i−j)r2)x的nnn次项系数为(i+jr+(k−i−j)r2)nn!\frac{(i+jr+(k-i-j)r^2)^n}{n!}n!(i+jr+(k−i−j)r2)n
所以最终答案为:
=13k∑i=0k∑j=0k−iCki×Ck−ij×(i+jr+(k−i−j)r2)n=\frac{1}{3^k}\sum_{i=0}^{k}\sum_{j=0}^{k-i}C_{k}^{i}\times C_{k-i}^{j}\times (i+jr+(k-i-j)r^2)^n=3k1i=0∑kj=0∑k−iCki×Ck−ij×(i+jr+(k−i−j)r2)n
后话:其实,对于d=2d=2d=2的情况,–1就是二次单位根。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=19491001;
const int r=18827933;
const int K=500010;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int add(int a,int b){return a+b>=mod?a+b-mod:a+b;};
int dec(int a,int b){return a<b?a-b+mod:a-b;}
int mul(int a,int b){return 1ll*a*b%mod;}
int ksm(int a,int b){int res=1;while(b){if(b&1) res=mul(res,a);b>>=1;a=mul(a,a);}return res;
}
int inv(int a){return ksm(a,mod-2);
}
int n,k,d,fac[K],ifac[K];
int C(int n,int m){return mul(fac[n],mul(ifac[n-m],ifac[m]));
}
int main(){n=read();k=read();d=read();if(d==1){printf("%d\n",ksm(k,n));return 0;}fac[0]=1;for(int i=1;i<=k;i++) fac[i]=mul(fac[i-1],i);ifac[k]=inv(fac[k]);for(int i=k;i>=1;i--) ifac[i-1]=mul(ifac[i],i);if(d==2){int ans=0;for(int i=0;i<=k;i++) ans=add(ans,mul(C(k,i),ksm(2*i-k,n)));ans=mul(ans,inv(ksm(2,k)));printf("%d\n",ans);return 0;}int ans=0;for(int i=0;i<=k;i++){int sum=0;for(int j=0;j<=k-i;j++)sum=add(sum,mul(C(k-i,j),ksm(((ll)r*r*i%mod+(ll)r*j%mod+k-i-j)%mod,n)));ans=add(ans,mul(sum,C(k,i)));}ans=mul(ans,inv(ksm(3,k)));printf("%d\n",ans);return 0;
}
[集训队作业2018] 复读机(生成函数,单位根反演)相关推荐
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- UOJ#449. 【集训队作业2018】喂鸽子
#449. [集训队作业2018]喂鸽子 DP好题 法一:min-max容斥 处理前m个,最快吃饱的鸽子期望的时间 根据期望的定义 考虑每个方案数的概率*期望次数 枚举前m个用了x个,概率都是(1/m ...
- uoj#422. 【集训队作业2018】小Z的礼物
uoj#422. [集训队作业2018]小Z的礼物 题目描述 Solution 所有礼物全部取到的方案数并不好求,因此我们考虑min−maxmin-maxmin−max容斥,转化为第一次取到集合中某一 ...
- UOJ#418. 【集训队作业2018】三角形
#418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...
- UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ450.html 题解 首先有一个东西叫做"单位根反演",它在 FFT 的时候用到过: ...
- 【集训队作业2018】复读机【指数型生成函数】【单位根反演】【二项式定理】
传送门 单位根反演听着高级,其实没啥技术含量-- 本文是篇几乎没有证明的佛系讲解 单位根反演的式子长这样: 1n∑i=0n−1ωnik=[k∣n]\frac{1}{n}\sum_{i=0}^{n-1} ...
- 【集训队作业2018】复读机
即使是一道菜题,也掩盖不了窝生成函数弱的事实. 窝看到题目只想到了DP,还是生成函数不够熟.然后直到神仙WWJ提醒我用生成函数-- 首先是排列,那就可以写成指数型生成函数的优美形式.直接表示成exp吧 ...
- [集训队作业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 ...
- 集训队作业2018: 青春猪头少年不会梦到兔女郎学姐(多限制容斥)(生成函数)(组合数学)
题意 给定 nnn 种颜色的球,第 iii 种颜色的球数量为 aia_iai 个,一种排列的贡献可以如下计算:先把这个序列首尾相连,然后把所有相邻且颜色相同的段拿出来,贡献为他们的长度之积,求所有排 ...
最新文章
- Word2010去除灰色中括号标记
- centos7精简安装后使用发现没有killall命令
- (转)asp和asp.net区别
- Linux shell 正则表达式用法
- 概率整形技术(PCS)介绍
- php网站怎么缓存,一个php网站缓存代码分享
- 处理Img标签中src无效时出现的border
- MySQL(四)索引的使用
- ds证据理论python实现_ALI模型理论以及Python实现
- MySQL优化(2)--------常用优化
- 新建工程后编译运行出现,无法找到*.obj问题解决方案
- Python的第三方库pillow
- Quartus II 9.0sp1之功能仿真
- PowerDesigner工具箱palette关了如何重新打开
- 点阵字库制作和使用(一)
- python 网易云音乐uc缓存转换mp3
- 机器人系统数学建模(现代控制理论1)
- 机器人语音问答流程及借助百度API Python实现
- 关于VS2010下编译NTL库方法及NTL库的应用
- PEST分析顺丰服务需求_快递行业宏观环境分析
热门文章
- 帆软获取上月的第一天与最后一天_《原神》岩港打工第一天怎么玩 岩港打工第一天玩法攻略...
- java实用教程——组件及事件处理——ActionEvent事件
- 算法设计与分析——贪心算法——活动安排问题
- 360 屏蔽ajax,怎么在easy ui做全局Ajax拦截啊?
- 全年营业额怎么计算_门店盈亏平衡计算及案例分析 | 商品管理
- 算法-排序-计数排序(包含对非负数和整数的排序)
- PAT(乙级) 1002 写出这个数 (20point(s)) Python
- Codeforces Round #586 (Div. 1 + Div. 2) D. Alex and Julian 数学 + 思维
- CF1237F Balanced Domino Placements(组合计数,dp)
- CF785E Anton and Permutation