题目:http://codeforces.com/gym/101933/problem/K

其实每个点的颜色只要和父亲不一样即可;

所以至多 i 种颜色就是 \( i * (i-1)^{n-1} \),设为 \( f(i) \),设恰好 i 种颜色为 \( g(i) \)

那么 \( f(i) = \sum\limits_{j=0}^{i} C_{i}^{j} * g(j) \)

二项式反演得到 \( g(i) = \sum\limits_{j=0}^{k} (-1)^{k-j} * C_{k}^{j} * f(j) \)

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int const xn=,mod=1e9+;
int n,k,f[xn],c[xn][xn];
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
ll pw(ll a,int b){ll ret=; for(;b;b>>=,a=a*a%mod)if(b&)ret=ret*a%mod; return ret;}
void init()
{
for(int i=;i<=k;i++)c[i][]=;
for(int i=;i<=k;i++)
for(int j=;j<=i;j++)
c[i][j]=upt(c[i-][j]+c[i-][j-]);
}
int main()
{
n=rd(); k=rd(); init();
for(int i=;i<n;i++)rd();
for(int i=;i<=k;i++)f[i]=(ll)i*pw(i-,n-)%mod;
int ans=;
for(int i=;i<=k;i++)ans=upt(ans+(ll)f[i]*c[k][i]%mod*(((k-i)&)?-:));
printf("%d\n",ans);
return ;
}

最新文章

  1. 浏览器兼容性-JS篇
  2. Error:(1, 1) error: illegal character: \65279解决方法
  3. View优化
  4. GIT分支管理模型
  5. leetcode 147. Insertion Sort List ----- java
  6. Oracle外部表详解(转载)
  7. 【Android - MD】之RecyclerView的使用
  8. C++类訪问控制及继承
  9. jdk,j2ee,j2se,j2me的概念区别
  10. c++ 文件读写(转)
  11. 基于visual Studio2013解决C语言竞赛题之1016循环打印矩阵
  12. .Net大局观(2).NET Core 2.0 特性介绍和使用指南
  13. 【Codeforces Round 438 A B C D 四个题】
  14. C++入门笔记(二)变量和基本类型
  15. C++中的string类型转换为int类型
  16. JUC详解
  17. day 66 crm(3) 自创组件stark界面展示数据
  18. IOS tableview 横向滚动
  19. MySQL的七种join
  20. 安装red5 1.0.1版本Java_home不能用Java7

热门文章

  1. 断点续传JAVA实现
  2. list— 把数组中的值赋给一组变量
  3. 基于Visual c++ 2012的php扩展开发 - HelloWord!
  4. ceph安装各种报错
  5. 监控pbs运行状况
  6. 解决maven寻找依赖关系失败的问题
  7. 考勤助手ER图2.0版本所存在的问题
  8. 轻松掌握XMLHttpRequest对象------【这是.net 版本】
  9. HDU 4004 The Frog&#39;s Games(2011年大连网络赛 D 二分+贪心)
  10. 多线程下使用Jedis