GYM 101933K(二项式反演、排列组合)
方法一
- 设\(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(二项式反演、排列组合)的更多相关文章
- Codeforces Gym 100187D D. Holidays 排列组合
D. Holidays Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/D ...
- CF gym 101933 K King's Colors —— 二项式反演
题目:http://codeforces.com/gym/101933/problem/K 其实每个点的颜色只要和父亲不一样即可: 所以至多 i 种颜色就是 \( i * (i-1)^{n-1} \) ...
- Digit Division(排列组合+思维)(Gym 101480D )
题目链接:Central Europe Regional Contest 2015 Zagreb, November 13-15, 2015 D.Digit Division(排列组合+思维) 题解: ...
- CF gym 101933 K. King's Colors(二项式反演)
传送门 解题思路 首先给出的树形态没用,因为除根结点外每个点只有一个父亲,它只需要保证和父亲颜色不同即可.设\(f(k)\)表示至多染了\(k\)种颜色的方案,那么\(f(k)=(k-1)^{(n-1 ...
- Codeforces 140E(排列组合、dp)
要点 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数.2.方案数.3.具体染色数. 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个 ...
- P4859 已经没有什么好害怕的了(dp+二项式反演)
P4859 已经没有什么好害怕的了 啥是二项式反演(转) 如果你看不太懂二项式反演(比如我) 那么只需要记住:对于某两个$g(i),f(i)$ ---------------------------- ...
- 2018.11.07 hdu1465不容易系列之一(二项式反演)
传送门 其实标签只是搞笑的. 没那么难. 二项式反演只是杀鸡用牛刀而已. 这道题也只是让你n≤20n\le20n≤20的错排数而已. 还记得那个O(n)O(n)O(n)的递推式吗? 没错那个方法比我今 ...
- 【CTS2019】珍珠【生成函数,二项式反演】
题目链接:洛谷 pb大佬说这是sb题感觉好像有点过fan...(我还是太弱了) 首先,设$i$这个数在序列中出现$a_i$次,要求$\sum_{i=1}^D[a_i \ mod \ 2]\leq n- ...
- [LOJ3119][CTS2019|CTSC2019]随机立方体:组合数学+二项式反演
分析 感觉这道题的计数方法好厉害.. 一个直观的思路是,把题目转化为求至少有\(k\)个极大的数的概率. 考虑这样一个事实,如果钦定\((1,1,1),(2,2,2),...,(k,k,k)\)是那\ ...
随机推荐
- 使用C语言解析URL
1. [代码]容易写成自己输入URL,这里测试一个例子 #include <stdio.h>#include <stdlib.h>#include <string ...
- codeforces 658A A. Bear and Reverse Radewoosh(水题)
题目链接: A. Bear and Reverse Radewoosh time limit per test 2 seconds memory limit per test 256 megabyte ...
- bjwc Day0 大型签到日
1.18期末考试 1.19试卷讲评 1.20我开始了bjwc愉快的冬眠之旅 上午先是颁发noip一等奖 我在台下笑得像个没有一等奖的孩子/手动微笑 然后去机房试了一下机 坐在鸡神边上,键盘竟然是坏的, ...
- hdfs 查看报告--命令(hdfs dfsadmin -report)
[hadoop@master sbin]$ hdfs dfsadmin -reportConfigured Capacity: 8202977280 (7.64 GB)Present Capacity ...
- redis cluster 实践总结
最近项目接触到了redis cluster,现在趁着使用做一下总结,记录一下遇到过的问题,简单的概述一下常用到的命令和功能. 本篇文章主要是以运维的角度去讲述如何去更好的规划redis clust ...
- WC2017 冬眠记
2017年2月3日,为期7天的冬眠营冬令营正式开幕. 前4天我们见到了各种集训队dalao们的华丽身姿 感受到了听课听不懂睡觉又惭愧的无力感 见到了几百号人近一半玩手机,剩下的一半有一半在睡觉,再剩下 ...
- 洛谷P3373线段树模板2
题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ...
- Poj1007_DNA Sorting(面向对象方法)
一.Description One measure of ``unsortedness'' in a sequence is the number of pairs of entries that a ...
- LWIP的底层结构(物理层)
LWIP的底层结构(物理层) 转自:http://bluefish.blog.51cto.com/214870/158418 我们前面讲到说是ip层的发送和接收都是直接调用了底层,也就是设备驱动层的函 ...
- MFC中界面自适应
void CMyDlg::OnSize(UINT nType, int cx, int cy){ CDialogEx::OnSize(nType, cx, cy); CRect rt; GetClie ...