题意: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. shell设置时间递减脚本

    经常要用shell来做时间的定时任务,尤其是用sqoop脚本拉取数据的时候,那么假如当你要导入数据是残缺的时候呢,我写了一个能自定义时间并逐条递减的程序 #!/bin/bash   . /etc/pr ...

  2. C++数据类型之实型(浮点型)&科学计数法

    实型(浮点型) **作用**:用于==表示小数== 浮点型变量分为两种: 1. 单精度float 2. 双精度double 两者的**区别**在于表示的有效数字范围不同. float类型数据,需在数据 ...

  3. MySql General error:2006

    当启用模块时发生Mysql数据库错误,错误信息见附件,实际是“General error: 2006 MySQL server has gone away......”错误. 解决方法:找到my.in ...

  4. CF698F Coprime Permutation

    题意:求有多少种符合要求的排列满足对于所有i,j,当gcd(i,j)=1时,gcd(pi,pj)=1. 排列上的一些位置给出. 标程: #include<bits/stdc++.h> us ...

  5. 关于Cadence OrCad 16.6的破解

    相信很多人都知道去老吴的博客上找安装包和破解文件,但是上面的自称一键式破解程序.以及破解图文说明,都是很有问题的. 首先,该一键式破解程序默认的文件后缀与该程序指向的安装压缩包后缀不一致:其次,该程序 ...

  6. Scala 方法与函数简单记录

    /** * Scala 方法与函数 * Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法 */ o ...

  7. scala中Tuple简单使用

    /** * Tuple简单使用记录 * 最大22个参数 */ object TupleUse { def main(args: Array[String]): Unit = { // 简单Tuple ...

  8. python 随便笔记

    1 判断字符串中是否有数字 i.isdigit()==True else False #判断是否是数字i.isalpha()==True else False #判断是否是字母 i.isspace() ...

  9. dart中的typedef <函数别名>

    typedef定义如下: typedef 给某一种特定的函数类型起了一个名字,可以认为是一个类型的别名.或者这样理解: 自己定义了一种数据类型,不过这种数据类型是函数类型,按照这种类型实例化后的对象, ...

  10. (转)Android在子线程中更新Activity中UI的方法

    转:http://blog.sina.com.cn/s/blog_3fe961ae0100mvc5.html 在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处 ...