【做题】UOJ450 - 复读机——单位根反演
原文链接 https://www.cnblogs.com/cly-none/p/UOJ450.html
题意:请自行阅读。
考虑用生成函数来表示答案。因为秒之间是有序的,所以这应当是个指数生成函数。故答案就是
\]
突破口显然是在\([d|i]\)上。
于是考虑使用单位根反演。也就是
\]
于是就直接带入,得到
\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 - 复读机——单位根反演的更多相关文章
- UOJ 450 【集训队作业2018】复读机——单位根反演
题目:http://uoj.ac/problem/450 重要式子: \( e^x = \sum\limits_{i=0}^{\infty} \frac{x^i}{i!} \) \( ( e^{a*x ...
- [2018集训队作业][UOJ450] 复读机 [DP+泰勒展开+单位根反演]
题面 传送门 思路 本文中所有$m$是原题目中的$k$ 首先,这个一看就是$d=1,2,3$数据分治 d=1 不说了,很简单,$m^n$ d=2 先上个$dp$试试 设$dp[i][j]$表示前$i$ ...
- UOJ450 复读机
题意:n个位置,k种颜色.求有多少种方案使得每种颜色恰出现d的倍数次. 解:d=1就快速幂,n,k很小就DP,记得乘组合数来分配位置. d = 2 / 3的时候,考虑生成函数. f(x) = ∑[d ...
- uoj450 【集训队作业2018】复读机(生成函数,单位根反演)
uoj450 [集训队作业2018]复读机(生成函数,单位根反演) uoj 题解时间 首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] ...
- UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ450.html 题解 首先有一个东西叫做“单位根反演”,它在 FFT 的时候用到过: $$\frac 1 ...
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- uoj#450. 【集训队作业2018】复读机(单位根反演)
题面 传送门 题解 我的生成函数和单位根反演的芝士都一塌糊涂啊-- \(d=1\),答案就是\(k^n\)(因为这里\(k\)个复读机互不相同,就是说有标号) \(d=2\),我们考虑复读机的生成函数 ...
- UOJ450 【集训队作业2018】复读机【生成函数】
题目链接:UOJ EI神仙加强版 既然这题模数是今天日期减去\(7\times 10^5\),那就要赶紧把这题做了. 首先肯定是考虑指数型生成函数,列出来之后使用单位根反演一波. \[\begin{a ...
- 牛客寒假算法基础集训营2 【处女座与复读机】DP最小编辑距离【模板题】
链接:https://ac.nowcoder.com/acm/contest/327/G来源:牛客网 一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女 ...
随机推荐
- Elasticsearch学习笔记(八)Elasticsearch的乐观锁并发控制
一.基于_version的乐观锁并发控制 语法:PUT /test_index/test_type/id?version=xxx 更新时带上数据 ...
- com.alibaba.druid.pool.DruidDataSource : {dataSource-2} init error
这几天准备写一个项目,其中的整合druid的时候,发现出现了下面这个错误.找了好久都没有找到.网上的各种解决方法都不对. 2018-11-07 16:26:28.940 INFO 19684 --- ...
- SQL对照LinQ的基本语句
查询全表: string sql = "SELECT * FROM UserInfo"; var lamAll = db.UserInfo; var LinAll = from u ...
- 怎么eclipse或MyEclipse中添加javaSe的源码
怎么eclipse或MyEclipse中添加javaSe的源码 有时在eclipse里我们调用java提供给我们的方法,我们有时需要查看java提供给我们的调用方法的源码或java提供给我们的核心类的 ...
- LeetCode 5 最长对称串
LeetCode 5 最长对称串 最早时候做这道题的时候还是用Java写的,用的是字符串匹配的思路,一直Time Limit Exceeded.甚至还想过用KMP开优化子串查找. public cla ...
- FB面经 Prepare: LCA of Deepest Nodes in Binary Tree
给一个 二叉树 , 求最深节点的最小公共父节点 . retrun . 先用 recursive , 很快写出来了, 要求用 iterative . 时间不够了... Recursion: 返回的时候返 ...
- lumen----------A facade root has not been set.
1.新拉下来的lumen源码,直接使用Log::info是不行的.汇报如下图错误 解决办法如下图,因为lumen需要设置一些开关
- Kinetis Design Studio 下使用J-Link下载程序
1.安装J-Link驱动. 在KDS安装目录下已自带J-Link驱动,进入以下目录(以我的为例): C:\Freescale\KDS_1.1.1\segger\USBDriver 将看到CDC.x64 ...
- PHPexcel(2)
//导出 public function export(){ $xlsData = Db('ent_apply')->select(); Vendor('PHPExcel.PHPExcel'); ...
- kaggle learn python
def has_lucky_number(nums): return any([num % 7 == 0 for num in nums]) def menu_is_boring(meals): &q ...