CF gym 101933 K. King's Colors(二项式反演)
##解题思路
首先给出的树形态没用,因为除根结点外每个点只有一个父亲,它只需要保证和父亲颜色不同即可。设$f(k)$表示至多染了$k$种颜色的方案,那么$f(k)=(k-1)^{(n-1)}*k$,而我们要求的是恰好染$k$种颜色的方案数,设其为$g(k)$,易得
g(k)=\sum\limits_{i=1}^k\dbinom{k}{i}f(i)
\]
发现这个可以二项式反演
g(k)=\sum\limits_{i=1}^k(-1)^{k-i}\dbinom{n}{i}f(i)
\]
然后就可以直接算了。
##代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=2505;
const int MOD=1e9+7;
typedef long long LL;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
}
int n,k,f[N],ans,fac[N],inv[N];
inline int fast_pow(int x,int y){
int ret=1;
for(;y;y>>=1){
if(y&1) ret=(LL)ret*x%MOD;
x=(LL)x*x%MOD;
}
return ret;
}
inline int C(int x,int y){
return (LL)fac[x]*inv[y]%MOD*inv[x-y]%MOD;
}
int main(){
n=rd(),k=rd();int x;fac[0]=1;
for(int i=1;i<n;i++) x=rd();
for(int i=1;i<=k;i++) fac[i]=(LL)fac[i-1]*i%MOD;
inv[k]=fast_pow(fac[k],MOD-2);
for(int i=k-1;~i;i--) inv[i]=(LL)inv[i+1]*(i+1)%MOD;
for(int i=2;i<=k;i++) f[i]=(LL)fast_pow(i-1,n-1)*i%MOD;
for(int i=1;i<=k;i++){
if(!((k-i)&1)) ans=ans+(LL)C(k,i)*f[i]%MOD;
else ans=ans+(MOD-(LL)C(k,i)*f[i]%MOD);
ans%=MOD;
}
printf("%d\n",ans);
return 0;
}
CF gym 101933 K. King's Colors(二项式反演)的更多相关文章
- CF gym 101933 K King's Colors —— 二项式反演
题目:http://codeforces.com/gym/101933/problem/K 其实每个点的颜色只要和父亲不一样即可: 所以至多 i 种颜色就是 \( i * (i-1)^{n-1} \) ...
- CF gym101933 K King's Colors——二项式反演
题目:http://codeforces.com/gym/101933/problem/K 每个点只要和父亲不同色就行.所以 “至多 i 种颜色” 的方案数就是 i * ( i-1 )n-1 . #i ...
- Codeforces Gym 100851 K King's Inspection ( 哈密顿回路 && 模拟 )
题目链接 题意 : 给出 N 个点(最多 1e6 )和 M 条边 (最多 N + 20 条 )要你输出一条从 1 开始回到 1 的哈密顿回路路径,不存在则输出 " There is no r ...
- Gym 101933
Gym 101933 B. Baby Bites水题直接模拟即可 #include <cstdio> #include <cstring> #include <queue ...
- Gym .101933 Nordic Collegiate Programming Contest (NCPC 2018) (寒假gym自训第四场)
(本套题算是比较温和吧,就是罚时有点高. B .Baby Bites 题意:给出一个婴儿给出的数组,有一些数字听不清楚,让你还原,问它是否是一个从1开始的一次增加的数组. 思路:从左往右依次固定,看是 ...
- BZOJ3622 已经没有什么好害怕的了 【dp + 二项式反演】
题目链接 BZOJ3622 题解 既已开题 那就已经没有什么好害怕的了 由题目中奇怪的条件我们可以特判掉\(n - k\)为奇数时答案为\(0\) 否则我们要求的就是糖果大于药片恰好有\(\frac{ ...
- BZOJ 2839: 集合计数(二项式反演)
传送门 解题思路 设\(f(k)\)为交集元素个数为\(k\)的方案数.发现我们并不能直接求出\(f(k)\),就考虑容斥之类的东西,容斥首先要扩大限制,再设\(g(k)\)表示至少有\(k\)个交集 ...
- NOI Online 游戏 树形dp 广义容斥/二项式反演
LINK:游戏 还是过于弱鸡 没看出来是个二项式反演,虽然学过一遍 但印象不深刻. 二项式反演:有两种形式 一种是以恰好和至多的转换 一种是恰好和至少得转换. 设\(f_i\)表示至多的方案数 \(g ...
- CF Gym101933K King's Colors
题目分析 题目要求在树上涂上恰好\(K\)种颜色的方案数. 设\(f(k)\)表示恰好涂上\(k\)种颜色的方案数(答案即为\(f(K)\)). 设\(g(k)\)表示至多涂上\(k\)种颜色的方案数 ...
随机推荐
- Visual Studio 2008 附加进程调试
关于附加进程调试的问题: 在项目当中经常使用“附加到进程”来调试项目,感觉挺方便的.我们做的项目通常都会发布到IIS(特别是B/S),一可以直接通过地址栏输入地址就可以运行项目,不必去使用开发工具来打 ...
- window 任务管理器
用的是win10 系统,一般window都差不多. 1.查看进程: 2.查看端口:性能 --> 打开资源资源监视器 --> 网络 --> 侦听端口 3.查看磁盘活动(查看文件被哪个进 ...
- selenium2-java 浏览器下进行登录
完整代码实现如下: package linear; import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import ...
- sql server中实现mysql的find_in_set函数和group_concat类似功能的讲解
charindex(',' + ' test '+ ',' , ',' + test2+ ',')>0 灵活运用 SQL SERVER FOR XML PATH FOR XML ...
- iview+vue 使用中遇到的问题(分页)
1.分页默认页数 当页面只有一个功能需要分页组件时,引用iview分页组件当然没问题.当一个页面中有多个需要分页组件的时候,便容易出现问题.例如:在项目中有多个不同的表格需要分页功能,几个表格共用一个 ...
- PAT 2019-3 7-3 Telefraud Detection
Description: Telefraud(电信诈骗) remains a common and persistent problem in our society. In some cases, ...
- cita 源码研究
适用环境 vim + YouCompleteMe 使用 github 源,不能使用 ustc 源 git clone --depth 1 --recusive https://github.com/k ...
- VB - 变量
Cbool函数将变量转换成布尔值: Cbyte函数将变量转换为0到255之间的整数. Ccur函数.Cdbl函数和Csng函数将变量转换为浮点数值,前者只精确到小数点后四位,后两者要更加精确,数值的范 ...
- javascript中数组的应用总结
最近在总结javascript的相关应用,今天对js中的数组部分进行归纳总结,以便在以后的工作中有所参考. 1.在js中数组的定义方式有两种: var a = [1,2,3,4]; var b = n ...
- spring3.0+jsf+ibatis整合
user.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLI ...