题意:n个位置,k种颜色。求有多少种方案使得每种颜色恰出现d的倍数次。

解:d=1就快速幂,n,k很小就DP,记得乘组合数来分配位置。

d = 2 / 3的时候,考虑生成函数。

f(x) = ∑[d | i] / (i!)

然后发现d = 2的时候就是(ex + e-x) / 2,这个东西的k次方可以用二项式定理展开,然后O(klogn)算,log是快速幂。

d = 3的时候用单位根反演,O(k2)枚举系数,同样算。因为我不想学单位根反演就没写...

 #include <bits/stdc++.h>

 typedef long long LL;

 const int N = , MO = ;

 int n, k, d;

 inline int qpow(int a, int b) {
int ans();
while(b) {
if(b & ) {
ans = (LL)ans * a % MO;
}
a = (LL)a * a % MO;
b = b >> ;
}
return ans;
} namespace DP {
int f[][], C[][];
inline void solve() {
f[][] = ;
for(int i = ; i <= ; i++) {
C[i][] = C[i][i] = ;
for(int j = ; j < i; j++) {
C[i][j] = (C[i - ][j] + C[i - ][j - ]) % MO;
}
}
for(int i = ; i < k; i++) {
for(int j = ; j <= n; j++) {
for(int p = ; j + p <= n; p += d) {
(f[i + ][j + p] += (LL)f[i][j] * C[n - j][p] % MO) %= MO;
}
}
}
printf("%d\n", f[k][n]);
return;
}
} namespace D2 { int fac[N], inv[N], invn[N]; inline int C(int n, int m) {
if(n < || m < || n < m) return ;
return (LL)fac[n] * invn[m] % MO * invn[n - m] % MO;
} inline void solve() {
fac[] = inv[] = invn[] = ;
fac[] = inv[] = invn[] = ;
for(int i = ; i <= k; i++) {
fac[i] = (LL)fac[i - ] * i % MO;
inv[i] = (LL)inv[MO % i] * (MO - MO / i) % MO;
invn[i] = (LL)invn[i - ] * inv[i] % MO;
} int ans = ;
for(int i = ; i <= k; i++) {
ans += (LL)C(k, i) * qpow( * i - k, n) % MO;
ans %= MO;
}
int temp = qpow((MO + ) / , k); printf("%lld\n", ((LL)temp * ans % MO + MO) % MO);
return;
}
} int main() { scanf("%d%d%d", &n, &k, &d);
if(d == ) {
printf("%d\n", qpow(k, n));
return ;
}
if(n <= && k <= ) {
DP::solve();
return ;
}
if(d == ) {
D2::solve();
return ;
}
return ;
}

60分代码

UOJ450 复读机的更多相关文章

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

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

  2. 【做题】UOJ450 - 复读机——单位根反演

    原文链接 https://www.cnblogs.com/cly-none/p/UOJ450.html 题意:请自行阅读. 考虑用生成函数来表示答案.因为秒之间是有序的,所以这应当是个指数生成函数.故 ...

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

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

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

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

  5. UOJ #450「集训队作业2018」复读机

    UOJ #450 题意 有$ k$台复读机,每时每刻有且只有一台复读机进行复读 求$ n$时刻后每台复读机的复读次数都是$ d$的倍数的方案数 $ 1\leq d \leq 3,k \leq 5·10 ...

  6. 处女座与复读机 DP

    题目链接:https://ac.nowcoder.com/acm/contest/327/G 题意:给你两个字符串序列,让你根据第二个序列判断是不是 复读机,复读机会有以下特征 1.       将任 ...

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

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

  8. 牛客国庆集训派对Day4 J-寻找复读机

    链接:https://www.nowcoder.com/acm/contest/204/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...

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

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

随机推荐

  1. UVA 240 Variable Radix Huffman Encoding

    题目链接:https://vjudge.net/problem/UVA-240 题目大意 哈夫曼编码是一种最优编码方法.根据已知源字母表中字符出现的频率,将源字母表中字符编码为目标字母表中字符,最优的 ...

  2. Redis基于主从复制的RCE(redis4.x 5.x)复现

    使用docker建立redis 拉取镜像 运行 查看 可以连接,存在未授权 https://github.com/Ridter/redis-rce 发送poc i:正向连接 r:反弹 反弹成功

  3. Centos 7 ping 不通外网

    首先检查添加DNS是否正常,如不存在则添加dns: [root@cgls]# vim /etc/resolv.conf nameserver 114.114.114.114 nameserver 8. ...

  4. LA 3263 /// 欧拉定理 oj21860

    题目大意: n个端点的一笔画 第n个和第1个重合 即一笔画必定是闭合曲线 输出平面被分成的区域数 欧拉定理 V+F-E=2 即 点数+面数-边数=2 (这里的面数包括了外部) #include < ...

  5. springcloud(十六):服务网关zuul (2)

    Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制.Filter的生命周期有4个,分别是“PRE”.“ROUTING”.“POST”.“ERROR”,整个生命周期可以用下图来表示. ...

  6. Ajax.BeginForm 在 Chrome下的问题

    项目背景:MVC4 代码: @using (Ajax.BeginForm("Index", "GoingMeter", new AjaxOptions { On ...

  7. C 语言源代码说明

    void bdmain(void){/* 禁止 Cache 和 MMU */ cache_disable(); mmu_disable(); /* 端口初始化 */ port_init(); /* 中 ...

  8. Haar分类器方法

    一.Haar分类器的前世今生 二.人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方 ...

  9. FCC知识点总结

    1.DOMContentLoaded事件 2.延迟脚本 defer 3.异步脚本async 4.[找最长单词]—— 找出句子中最长的单词,并返回它的长度. 5.数组slice().splice() s ...

  10. python中的OrderedDict

    该类型存放顺序和添加顺序一致,比如逐个赋值,但和dict直接转化过去的顺序不一定一样. d1 = collections.OrderedDict() d1['b'] = 'B'd1['a'] = 'A ...