即使是一道菜题,也掩盖不了窝生成函数弱的事实。

窝看到题目只想到了DP,还是生成函数不够熟。然后直到神仙WWJ提醒我用生成函数……

首先是排列,那就可以写成指数型生成函数的优美形式。直接表示成exp吧,然后d的倍数就用单位根性质来处理。

所以实际上就是求 \([x^n] (\frac{\sum_{i=0}^{D - 1} e^{\omega_{D}^{i} x}}{D})^K\)

显然可以把底下的 \(D^K\) 提出来,此时求上面那个东西。

怎么求第 \(n\) 项系数啊?

这时候可以发现 \(D\) 大的时候 \(K\) 小了(然后只看了最后一条范围就被坑了)

于是发现可以暴力二项式展开!

枚举 \(i\) 次单位根的个数,复杂度 \(O(K^{D - 1})\),

然后剩下的东西根据指数函数的性质可以合并成一项 \(e^{Cx}\) ,此时系数只是一个快速幂的事情了。

单位根的事情就随便求一个丢上去好了。

#include <bits/stdc++.h>const int mod = 19491001;
const int MAXN = 500010;
typedef long long LL;
int mul(int a, int b) { return (LL) a * b % mod; }
void reduce(int & x) { x += x >> 31 & mod; }
int fastpow(int a, int b) {int res = 1;for (; b; b >>= 1, a = mul(a, a)) if (b & 1) res = mul(res, a);return res;
}
int n, K, D, fac[MAXN], inv[MAXN];
int C(int a, int b) { return (LL) fac[a] * inv[b] % mod * inv[a - b] % mod; }
int pr[3], ans;
void dfs(int S, int rest, int sum, int way) {if (S == D - 1) {reduce(sum += mul(pr[S], rest) - mod);reduce(ans += mul(fastpow(sum, n), way) - mod);return ;}for (int i = 0; i <= rest; ++i)dfs(S + 1, rest - i, (sum + (LL) pr[S] * i) % mod, mul(way, C(rest, i)));
}
int main() {std::cin >> n >> K >> D;fac[0] = fac[1] = inv[0] = inv[1] = 1;for (int i = 2; i <= K; ++i) {fac[i] = mul(fac[i - 1], i);inv[i] = mul(inv[mod % i], mod - mod / i);}for (int i = 2; i <= K; ++i)inv[i] = mul(inv[i - 1], inv[i]);pr[0] = 1;if (D == 2) pr[1] = mod - 1;if (D == 3) pr[1] = 663067, pr[2] = mul(pr[1], pr[1]);dfs(0, K, 0, 1);ans = mul(ans, fastpow(D, mod - 1 - K));std::cout << ans << std::endl;return 0;
}

转载于:https://www.cnblogs.com/daklqw/p/11588389.html

【集训队作业2018】复读机相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. WPF DataGrid 绑定DataSet数据 自动生成行号
  2. Android开发究竟该如何学习,成功入职字节跳动
  3. python调用shell命令-python中执行shell命令的几个方法小结
  4. Java基础-JDK动态代理
  5. python爬虫基础(二)~工具包: 下载包requests、urllib和解析包BeautifulSoup(bs4)、lxml.etree.xpath
  6. [译] 这可能是 2018 年最好的一篇 PHP 性能测评(包含 5.6 到 7.2,以及 HHVM)
  7. 减少GC开销的5个编码技巧
  8. 输入字符串统计字符串中每个字符出现的次数
  9. POSIX定时器Timer
  10. flash flip 效果集
  11. 怎么让照片变年轻_做了隆鼻,至少年轻5岁
  12. 这 8款开源思维导图工具真的很神奇【程序员必备学习工具】
  13. algorithm头文件中的函数:remove()与remove_if() 函数,……
  14. oracle恢复表的数据到某个时间点
  15. 其他计算机才能打印,关于HPM126A打印机共享问题-共享之后主机得打印一次后其他电脑才能打印...
  16. 马云:今天互联网创业还靠免费是死路一条
  17. Android应用向su申请root权限,以及Superuser进行授权管理的原理浅析
  18. el-tree处理大量数据
  19. 小白带你学安卓——初识android
  20. matlab中频域信号IFFT,MATLAB中ifft函数用法、性质、特性-以及与fft的组合应用全面深入解析(含程序)...

热门文章

  1. IDEA Reference - Essentials(基本要义)
  2. 数据库中存储日期的字段类型究竟应该用varchar还是datetime ?
  3. android SDK Manager 代理服务器设置
  4. QTP中使用ExecuteFile加载vbs脚本
  5. Linux基础常用命令
  6. CSS 选择器参考手册
  7. 约瑟夫问题-学习笔记
  8. Spring:源码解读Spring IOC原理
  9. JQuery对checkbox的操作
  10. 回首这六年,给新人一些建议,和同龄人共勉