传送门

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∑j​B(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!×2k1​i=0∑k​Cki​×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!×2k1​i=0∑k​Cki​×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)^n2k1​i=0∑k​Cki​×(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]=n1​i=0∑n−1​wnki​
注意到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​=31​i=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!×3k1​i=0∑k​j=0∑k−i​Cki​×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!×3k1​i=0∑k​j=0∑k−i​Cki​×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=3k1​i=0∑k​j=0∑k−i​Cki​×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] 复读机(生成函数,单位根反演)相关推荐

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

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

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

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

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

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

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

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

  5. UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ450.html 题解 首先有一个东西叫做"单位根反演",它在 FFT 的时候用到过: ...

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

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

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

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

  8. [集训队作业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 ...

  9. 集训队作业2018: 青春猪头少年不会梦到兔女郎学姐(多限制容斥)(生成函数)(组合数学)

    题意 给定 nnn 种颜色的球,第 iii 种颜色的球数量为 aia_iai​ 个,一种排列的贡献可以如下计算:先把这个序列首尾相连,然后把所有相邻且颜色相同的段拿出来,贡献为他们的长度之积,求所有排 ...

最新文章

  1. Word2010去除灰色中括号标记
  2. centos7精简安装后使用发现没有killall命令
  3. (转)asp和asp.net区别
  4. Linux shell 正则表达式用法
  5. 概率整形技术(PCS)介绍
  6. php网站怎么缓存,一个php网站缓存代码分享
  7. 处理Img标签中src无效时出现的border
  8. MySQL(四)索引的使用
  9. ds证据理论python实现_ALI模型理论以及Python实现
  10. MySQL优化(2)--------常用优化
  11. 新建工程后编译运行出现,无法找到*.obj问题解决方案
  12. Python的第三方库pillow
  13. Quartus II 9.0sp1之功能仿真
  14. PowerDesigner工具箱palette关了如何重新打开
  15. 点阵字库制作和使用(一)
  16. python 网易云音乐uc缓存转换mp3
  17. 机器人系统数学建模(现代控制理论1)
  18. 机器人语音问答流程及借助百度API Python实现
  19. 关于VS2010下编译NTL库方法及NTL库的应用
  20. PEST分析顺丰服务需求_快递行业宏观环境分析

热门文章

  1. 帆软获取上月的第一天与最后一天_《原神》岩港打工第一天怎么玩 岩港打工第一天玩法攻略...
  2. java实用教程——组件及事件处理——ActionEvent事件
  3. 算法设计与分析——贪心算法——活动安排问题
  4. 360 屏蔽ajax,怎么在easy ui做全局Ajax拦截啊?
  5. 全年营业额怎么计算_门店盈亏平衡计算及案例分析 | 商品管理
  6. 算法-排序-计数排序(包含对非负数和整数的排序)
  7. PAT(乙级) 1002 写出这个数 (20point(s)) Python
  8. Codeforces Round #586 (Div. 1 + Div. 2) D. Alex and Julian 数学 + 思维
  9. CF1237F Balanced Domino Placements(组合计数,dp)
  10. CF785E Anton and Permutation