原文链接 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. rand和srand的用法

    首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数)表头文件: #include<stdlib.h> ...

  2. pkg-config 详解

    转载自:https://blog.csdn.net/newchenxf/article/details/51750239 1 什么是pkg-config pkg-config是一个linux下的命令, ...

  3. requests库的基本使用

    1.发送get请求 import requests # response=requests.get('http://www.baidu.com') # 查看响应内容,返回的是已经解码的内容 # res ...

  4. 2019.04.21 python核心特征

    本阶段我们将了解Python是如何管理内存的,学习内存管理让我们掌握python的运行机制: 并且在python中有许多函数式编程的特性,比如闭包,装饰器和生成器,这些都是一些比较难掌握的概念,但面试 ...

  5. encodeURIComponent 和 decodeURIComponent 对字符串url编码 用于url拼字符传值

  6. 1231: ykc买零食

    1231: ykc买零食时间限制: 1 Sec  内存限制: 128 MB 题目描述 ykc的班级准备举行班级聚会,而身为生活委员的ykc要为此准备好零食,这天,ykc来到了学校的新起点超市,在转了3 ...

  7. Qt QLabel 大小随内容自动变化 && 内容填充整个label空间

    图1:label的本身大小 图2:给label设置文字,不做任何别的设置 ui->label->setText(QObject::tr("current font is %1&q ...

  8. css 快捷修改 checkbox 及 radio的背景图

    在CSS内选择要修改的input input[type=checkbox]:disabled{ //input类型等于复选框并且是disabled状态的所有(根据情况自由指定) -webkit-app ...

  9. [Docker] sh: docker-compose: not found

    有点坑爹,在使用  alpine 镜像的时候,明明在里面安装了docker-compose,/usr/local/bin/docker-compose也是存在的,却报 sh: docker-compo ...

  10. Oracle创建表空间、表、一级用户授权

    ---恢复内容开始--- 1. 安装: 百度一下你就知道 2. sqlplus登录/sqlplus命令登录 在安装Oracle时,你需要记住设置的“全局数据库名”(默认为orcl) 和 口令,在以两种 ...