方法一

  • 设\(f_i\)为最多使用\(i\)种颜色的涂色方案,\(g_i\)为恰好只使用\(i\)种颜色的涂色方案。可知此题答案为\(g_k\)。
  • 根据排列组合的知识不难得到\(f_k = \sum_{i=0}^k{C_k^i*g_i}\)。
  • 根据二项式反演的式子 or 容斥原理,有\(g_k = \sum_{i = 0}^k{(-1)^{k-i}*C_k^i*f_i}\),这时只要有\(f_i\)我们就可以累加得到最终答案,看题面考虑\(f_i\)的现实意义,根有\(i\)种可选,往下涂每个点有\(i-1\)种可选(因为是树形的,所以子节点涂色只要和父亲不同即可),故\(f_i = i * (i - 1)^{n - 1}\)。
#include <cstdio>

const int mod = 1e9 + 7;
int n, k, ans;
int C[2505][2505], f[2505]; int ksm(int a, int b) {
int res = 1;
for (; b; b >>= 1) {
if (b & 1) res = 1LL * res * a % mod;
a = 1LL * a * a % mod;
}
return res;
} void Pre() {
for (int i = 0; i <= k; i++) {
f[i] = 1LL * i * ksm(i - 1, n - 1) % mod;
C[i][i] = C[i][0] = 1;
for (int j = 1; j < i; j++) {
C[i][j] = (1LL * C[i - 1][j] + C[i - 1][j - 1]) % mod;
}
}
} int main() {
scanf("%d %d", &n, &k);
for (int i = 1, x; i < n; i++)
scanf("%d", &x);
Pre(); for (int i = 0; i <= k; i++) {
int a = (k - i) % 2 ? -1 : 1;
int tmp = (1LL * a * C[k][i] % mod * f[i] % mod + mod) % mod;
ans = (ans + tmp) % mod;
}
return !printf("%d\n", ans);
}

方法二

  • 假设\(f(n,k)\)是答案。
  • 染一个叶子节点,有两种情况:1.它的颜色是独一无二的:\(k*f(n-1,k-1)\)种染色方式;2.有别的节点和它颜色一样(则它不和父亲相同):\((k-1)*f(n-1,k)\)种染色方式。因此将这两种加起来就是答案。
#include <cstdio>
#include <cstring> typedef long long ll;
const int mod = 1e9 + 7;
int n, k;
int dp[2505][2505]; int f(int n, int k) {
if (n == 1) return k == 1 ? 1 : 0;
if (dp[n][k] != -1) return dp[n][k];
return dp[n][k] = ((ll)k * f(n - 1, k - 1) % mod + (ll)(k - 1) * f(n - 1, k) % mod) % mod;
} int main() {
scanf("%d %d", &n, &k);
for (int i = 1, x; i < n; i++) {
scanf("%d", &x);
}
memset(dp, -1, sizeof dp);
return !printf("%d\n", f(n, k));
}

方法二是直接染色了,也可以先求出模式数,再乘\(k!\)使其染色,详解我写在cf 140E

#include <cstdio>

typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 2510;
int n, k;
ll f[maxn][maxn]; int main() {
scanf("%d %d", &n, &k);
f[0][0] = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
f[i][j] = (f[i - 1][j - 1] + f[i - 1][j] * (j - 1)) % mod; ll ans = f[n][k];
for (int i = 1; i <= k; i++)
ans = ans * i % mod;
return !printf("%d\n", (int)ans);
}

GYM 101933K(二项式反演、排列组合)的更多相关文章

  1. Codeforces Gym 100187D D. Holidays 排列组合

    D. Holidays Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/D ...

  2. CF gym 101933 K King's Colors —— 二项式反演

    题目:http://codeforces.com/gym/101933/problem/K 其实每个点的颜色只要和父亲不一样即可: 所以至多 i 种颜色就是 \( i * (i-1)^{n-1} \) ...

  3. Digit Division(排列组合+思维)(Gym 101480D )

    题目链接:Central Europe Regional Contest 2015 Zagreb, November 13-15, 2015 D.Digit Division(排列组合+思维) 题解: ...

  4. CF gym 101933 K. King's Colors(二项式反演)

    传送门 解题思路 首先给出的树形态没用,因为除根结点外每个点只有一个父亲,它只需要保证和父亲颜色不同即可.设\(f(k)\)表示至多染了\(k\)种颜色的方案,那么\(f(k)=(k-1)^{(n-1 ...

  5. Codeforces 140E(排列组合、dp)

    要点 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数.2.方案数.3.具体染色数. 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个 ...

  6. P4859 已经没有什么好害怕的了(dp+二项式反演)

    P4859 已经没有什么好害怕的了 啥是二项式反演(转) 如果你看不太懂二项式反演(比如我) 那么只需要记住:对于某两个$g(i),f(i)$ ---------------------------- ...

  7. 2018.11.07 hdu1465不容易系列之一(二项式反演)

    传送门 其实标签只是搞笑的. 没那么难. 二项式反演只是杀鸡用牛刀而已. 这道题也只是让你n≤20n\le20n≤20的错排数而已. 还记得那个O(n)O(n)O(n)的递推式吗? 没错那个方法比我今 ...

  8. 【CTS2019】珍珠【生成函数,二项式反演】

    题目链接:洛谷 pb大佬说这是sb题感觉好像有点过fan...(我还是太弱了) 首先,设$i$这个数在序列中出现$a_i$次,要求$\sum_{i=1}^D[a_i \ mod \ 2]\leq n- ...

  9. [LOJ3119][CTS2019|CTSC2019]随机立方体:组合数学+二项式反演

    分析 感觉这道题的计数方法好厉害.. 一个直观的思路是,把题目转化为求至少有\(k\)个极大的数的概率. 考虑这样一个事实,如果钦定\((1,1,1),(2,2,2),...,(k,k,k)\)是那\ ...

随机推荐

  1. Matlab之rand(), randn(), randi()函数的使用方法

    1.  rand()函数用于生成取值在(0~1)之间均匀分布的伪随机数.rand(n):生成n*n的0~1之间的满足均匀分布的伪随机矩阵:rand(m,n):生成m*n的伪随机数:rand(m,n,' ...

  2. python类初探

    class human: is_alive=True is_man=True def __init__(self,age): print('this is __init__() method, whi ...

  3. elasticsearch-installation

    1. 安装Java JDK 移步 :sdfa 2. 下载elasticsearch url : https://artifacts.elastic.co/downloads/elasticsearch ...

  4. 机器学习:Colorization using Optimization

    今天介绍 Siggraph 2004 年的一篇文章: Colorization using Optimization,利用优化的方法对灰度图像进行着色,这里用到了非常经典的泊松方程以及稀疏矩阵的线性优 ...

  5. WPF开发学习笔记(转)

    总结下学习WPF的笔记,方便查阅 1   编译 添加程序集引用:WindowsBase.dll,PresentationCore.dll,PresentationFramework.dll 2  布局 ...

  6. BZOJ3127:[USACO2013OPEN]Yin and Yang

    浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem. ...

  7. 百度地图API的第一次接触——标注和信息窗的使用

    1.定义js函数,用于在指定位置添加标注,在标注位置添加并打开信息窗口 function addMarker(point, index){ // 创建图标对象 var myIcon = new BMa ...

  8. python json ajax django四星聚会

    什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...

  9. VijosP1626:爱在心中

    描述 “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有 ...

  10. 用mapreduce实现从hbase导出到hdfs,实现一个工具类,能够支持任意表 任意列 任意路径导出,并且支持表头

    分析: 1.由于是任意列 任意表 任意路径,我们很容易想到是参数传入,参数传入后怎么去获得参数,根据我们以往的经验就是通过args[]来获取,但是在mapper或者是reducer中,我们不能直接将参 ...