方法一

  • 设\(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. h5打电话发短信写邮件怎么实现

    // 一.打电话<a href="tel:0755-10086">打电话给:0755-10086</a> // 二.发短信,winphone系统无效< ...

  2. [原创]java开发实现word在线编辑及流转

    OA公文流转系统主要用于处理企业日常工作中内外部的各种公文,包括了公文的拟稿.审批.传阅.公告.归档,多层上级可以对下级撰写的公文进行逐级审批或修改,待最高级人员确认无误后即可进行核稿和发文等操作,最 ...

  3. 网站桌面端和手机端不同url的设置

    你的网站在搜索引擎中表现怎样很大程度上依赖于你的你的网站对于不同设备上的设计. 下面介绍了怎样基于URL构造来优化你的网站对于搜索引擎的支持. 决定你网页的URL构造 Determine the UR ...

  4. c macro pair

    成对使用的macro, 不过也有机会用错, 死都不知道怎么死的, 这宏... #define pthread_cleanup_push(func, val) \ { \ struct __darwin ...

  5. Windows下使用vim编写代码,使用nmake编译代码,使用vs来调试代码

    1.编写代码 2.编写Makefile,如果要调试, 2.1.需要在编译的时候加上/Zi ( Generates complete debugging information),编译由cl.exe来完 ...

  6. BZOJ4571:[SCOI2016]美味

    浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.p ...

  7. Algorithms & Data structures in C++& GO ( Lock Free Queue)

    https://github.com/xtaci/algorithms //已实现 ( Implemented ): Array shuffle https://github.com/xtaci/al ...

  8. 关于java基础中,接口里面父类的对象指向子类的引用

    父类的引用指向子类的对象,它只能看的到父类的那些方法~ 子类自身的方法看不到-- ······························· 如: interface Singer { //定义了 ...

  9. YOLO3训练widerface数据集

    因为YOLO3速度精度都很棒,所以想训练一下人脸模型,废话不多,进入正题 1写所有的配置文件 1.1 YOLO3-face.cfg 个人感觉YOLO的配置文件骑士和caffe差不多 在cfg/YOLO ...

  10. centos6.5安装sublime Text3破解版

    安装后的效果图: 在csdn上找到了一个破解版. http://download.csdn.net/download/phpscott2/5356561 安装后,能够运行,但每次打开都提示没有安装py ...