原文链接 https://www.cnblogs.com/cly-none/p/UOJ450.html

题意:请自行阅读。

考虑用生成函数来表示答案。因为秒之间是有序的,所以这应当是个指数生成函数。故答案就是

\[[x^n] \left( \sum_{i \geq 0} \frac {x^i} {i!} [d | i] \right)^k
\]

突破口显然是在\([d|i]\)上。

于是考虑使用单位根反演。也就是

\[\frac {1} {n} \sum_{i=0}^{n-1} \omega_{n}^{ik} = [n | k]
\]

于是就直接带入,得到

\[\begin{aligned}
\sum_{i \geq 0} \frac {x^i} {i!} [d | i] = & \sum_{i \geq 0} \frac {x^i} {i!} \left (\frac 1 d \sum_{j=0}^{d-1} \omega_{d}^{ij} \right) \\
= & \frac 1 d \sum_{j=0}^{d-1} \sum_{i \geq 0} \frac {x^i \omega_{d}^{ij}} {i!} \\
= & \frac 1 d \sum_{j=0}^{d-1} e^{w_{d}^j x}
\end{aligned}
\]

本题中模数\(MOD\)为\(19491001\),满足\(3 | (MOD -1)\)。

考虑这道题中\(d \leq 3\),且我们很容易求出\(e^{kx}\)中\(x^n\)前的系数。因此我们可以直接把这个式子展开为\(d\)项,再用二项式定理暴力计算答案。

复杂度是\(O(k^{d-1})\),能通过本题。(请注意所有四个子任务的分值之和为100)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
#define fir first
#define sec second
#define rep(i,a,b) for (int i = (a) ; i <= (b) ; ++ i)
#define rrp(i,a,b) for (int i = (a) ; i >= (b) ; -- i)
#define gc() getchar()
template <typename tp>
inline void read(tp& x) {
x = 0; char tmp; bool key = 0;
for (tmp = gc() ; !isdigit(tmp) ; tmp = gc())
key = (tmp == '-');
for ( ; isdigit(tmp) ; tmp = gc())
x = (x << 3) + (x << 1) + (tmp ^ '0');
if (key) x = -x;
} const int N = 500010, MOD = 19491001, G = 7;
int jc[N], inv[N];
int power(int a,int b) {
int ret = 1;
while (b) {
if (b & 1) ret = 1ll * ret * a % MOD;
a = 1ll * a * a % MOD;
b >>= 1;
}
return ret;
}
int comb(int a,int b) {
if (a < b || a < 0 || b < 0) return 0;
return 1ll * jc[a] * inv[b] % MOD * inv[a-b] % MOD;
}
int n,k,d,ans;
int main() {
cin >> n >> k >> d;
jc[0] = 1;
rep (i, 1, k) jc[i] = 1ll * jc[i-1] * i % MOD;
inv[k] = power(jc[k], MOD - 2);
rrp (i, k-1, 0) inv[i] = 1ll * inv[i+1] * (i+1) % MOD;
if (d == 1) {
printf("%d\n", power(k, n));
} else if (d == 2) {
for (int i = 0 ; i <= k ; ++ i)
(ans += 1ll * comb(k, i) * power(k - 2 * i, n) % MOD) %= MOD;
ans = 1ll * ans * power((MOD + 1) / 2, k) % MOD;
printf("%d\n", ans);
} else if (d == 3) {
int va = power(G, (MOD - 1) / 3);
int vb = power(va, 2);
int vc = power(va, 3);
rep (a, 0, k) rep (b, 0, k-a) {
int c = k - a - b;
ans += 1ll * jc[k] * inv[a] % MOD * inv[b] % MOD * inv[c] % MOD * power((1ll * va * a + 1ll * vb * b + 1ll * vc * c) % MOD, n) % MOD;
ans %= MOD;
}
ans = 1ll * ans * power(power(3, MOD-2), k) % MOD;
printf("%d\n", ans);
}
return 0;
}

小结:无。

【做题】UOJ450 - 复读机——单位根反演的更多相关文章

  1. UOJ 450 【集训队作业2018】复读机——单位根反演

    题目:http://uoj.ac/problem/450 重要式子: \( e^x = \sum\limits_{i=0}^{\infty} \frac{x^i}{i!} \) \( ( e^{a*x ...

  2. [2018集训队作业][UOJ450] 复读机 [DP+泰勒展开+单位根反演]

    题面 传送门 思路 本文中所有$m$是原题目中的$k$ 首先,这个一看就是$d=1,2,3$数据分治 d=1 不说了,很简单,$m^n$ d=2 先上个$dp$试试 设$dp[i][j]$表示前$i$ ...

  3. UOJ450 复读机

    题意:n个位置,k种颜色.求有多少种方案使得每种颜色恰出现d的倍数次. 解:d=1就快速幂,n,k很小就DP,记得乘组合数来分配位置. d = 2 / 3的时候,考虑生成函数. f(x) = ∑[d ...

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

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

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

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

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

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

  7. uoj#450. 【集训队作业2018】复读机(单位根反演)

    题面 传送门 题解 我的生成函数和单位根反演的芝士都一塌糊涂啊-- \(d=1\),答案就是\(k^n\)(因为这里\(k\)个复读机互不相同,就是说有标号) \(d=2\),我们考虑复读机的生成函数 ...

  8. UOJ450 【集训队作业2018】复读机【生成函数】

    题目链接:UOJ EI神仙加强版 既然这题模数是今天日期减去\(7\times 10^5\),那就要赶紧把这题做了. 首先肯定是考虑指数型生成函数,列出来之后使用单位根反演一波. \[\begin{a ...

  9. 牛客寒假算法基础集训营2 【处女座与复读机】DP最小编辑距离【模板题】

    链接:https://ac.nowcoder.com/acm/contest/327/G来源:牛客网 一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女 ...

随机推荐

  1. 理解 Memory barrier(内存屏障)无锁环形队列

    原文:https://www.cnblogs.com/my_life/articles/5220172.html Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问 ...

  2. Spring Boot事务管理(上)

    摘要 本文主要介绍基于Spring Boot的事务管理,尤其是@Transactional注解详细用法.首先,简要介绍Spring Boot中如何开启事务管理:其次,介绍在Spring,Spring ...

  3. 学习h264 的语法规则,如何才能看懂H264 的官方文档

    1. 今天想查h264 的帧率,查找资料如下: 首先要解析sps,得到两个关键的数值: num_units_in_tick, time_scale fps=time_scale/num_units_i ...

  4. 使用Eclipse来操作HDFS的文件

    一.常用类 1.Configuration Hadoop配置文件的管理类,该类的对象封装了客户端或者服务器的配置(配置集群时,所有的xml文件根节点都是configuration) 创建一个Confi ...

  5. SQLServer 大小写敏感配置

    设置表内大小写敏感 ALTER TABLE 表名 ) COLLATE Chinese_PRC_CI_AS --不区分大小写 ALTER TABLE tb ) COLLATE Chinese_PRC_C ...

  6. deviceMotion.userAcceleration加速度方向

    ios坐标系如图中所示,假设手机受到1个沿X正方向的力(假设该力产生了1m/s^2的加速度),那么deviceMotion.userAcceleration的值为多少呢? 答案是违反常识的:devic ...

  7. Mysql 5.7优化

    为了达到数据库胡最佳性能 1. 普通用户通过配置软件与硬件来实现 2. 高级用户会寻求机会改善MySQL本身,开发自己的数据存储引擎,硬件应用. 在数据库层面的优化 1. 表设计,通常列有适合的数据类 ...

  8. Mac下vim7.4+vimgdb让vim支持gdb源码调试

    下载vimgdb https://github.com/cpiger/vimgdb-for-vim7.4 下载vim7.4源码 将两个文件或者文件夹放到同一个目录解压 tar xjvf vim-7.4 ...

  9. MUI 返回顶部

    //绑定滚动到顶部按钮事件 if ($("#scroll-up").length > 0) { var scrollToTopBox = $("#scroll-up ...

  10. G面经Prepare: Longest All One Substring

    give a string, all 1 or 0, we can flip a 0 to 1, find the longest 1 substring after the flipping 这是一 ...