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)\)是那\ ...
随机推荐
- Matlab之rand(), randn(), randi()函数的使用方法
1. rand()函数用于生成取值在(0~1)之间均匀分布的伪随机数.rand(n):生成n*n的0~1之间的满足均匀分布的伪随机矩阵:rand(m,n):生成m*n的伪随机数:rand(m,n,' ...
- python类初探
class human: is_alive=True is_man=True def __init__(self,age): print('this is __init__() method, whi ...
- elasticsearch-installation
1. 安装Java JDK 移步 :sdfa 2. 下载elasticsearch url : https://artifacts.elastic.co/downloads/elasticsearch ...
- 机器学习:Colorization using Optimization
今天介绍 Siggraph 2004 年的一篇文章: Colorization using Optimization,利用优化的方法对灰度图像进行着色,这里用到了非常经典的泊松方程以及稀疏矩阵的线性优 ...
- WPF开发学习笔记(转)
总结下学习WPF的笔记,方便查阅 1 编译 添加程序集引用:WindowsBase.dll,PresentationCore.dll,PresentationFramework.dll 2 布局 ...
- BZOJ3127:[USACO2013OPEN]Yin and Yang
浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem. ...
- 百度地图API的第一次接触——标注和信息窗的使用
1.定义js函数,用于在指定位置添加标注,在标注位置添加并打开信息窗口 function addMarker(point, index){ // 创建图标对象 var myIcon = new BMa ...
- python json ajax django四星聚会
什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...
- VijosP1626:爱在心中
描述 “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有 ...
- 用mapreduce实现从hbase导出到hdfs,实现一个工具类,能够支持任意表 任意列 任意路径导出,并且支持表头
分析: 1.由于是任意列 任意表 任意路径,我们很容易想到是参数传入,参数传入后怎么去获得参数,根据我们以往的经验就是通过args[]来获取,但是在mapper或者是reducer中,我们不能直接将参 ...