1003 染色
     
 
Time Limit: 1sec    Memory Limit:256MB
Description

今天离散数学课学了有关树的知识,god_v是个喜欢画画的人,所以他喜欢对于一棵树上色,且相邻节点不能染相同颜色,他有k种颜色,他希望他染色完后,这棵树上每种颜色都有,他想请教你有多少种染色方案?由于方案数过大,输出对1e9+7取模的结果。

Input

第一行 n,k表示树的节点和颜色数量(1<=k<=n<=100000)

第二行 n-1个数字,第i个数字表示第i+1个节点的父亲的编号,(f[i]<i+1)
Output

一个数字,表示方案数(%1e9+7)

Sample InputCopy
6 4
1 2 2 4 5
Sample OutputCopy
600

题解:

如果不限制k种颜色全部用上,则方案数为f[k]=k*(k-1)^(n-1)(根节点有k种选择,其他节点有k-1种选择)。限制后,我们可以用容斥定理:ans=f[k] - C(k-1,k)*f[k-1] + C(k-2,k)*f[k-2] - .... + (-1)^(k-1) * C(1,k) * f[1];
f:用快速幂求出
线性求C(i,k) (1<=i<=k):C(i,k) = C(i-1,k) * (i-k+1) / i; 设mod=10^9+7,由于最后答案要%mod,则除以i要转化为乘以i在%mod下的逆元。
线性求逆元: inv[i]=((mod-mod/i))*inv[mod%i]%mod;(inv[i]为i的逆元,emm这里也可以用费马小定理来求)
O(nlogn)

 #include<bits/stdc++.h>
using namespace std; typedef long long LL;
const LL mod=1e9 + ;
const int N=;
LL c[N],inv[N]; void cal_c(int k)
{
inv[]=;
for(LL i=;i<=k;i++)
{
inv[i]=((mod-mod/i))*inv[mod%i]%mod;
}
c[]=;
for(LL i=;i<=k;i++) c[i]=c[i-]*(k-i+)%mod*inv[i]%mod;
} LL pow(LL x,LL y)
{
LL ans=;
while(y)
{
if(y&) ans=ans*x%mod;
x=x*x%mod;
y/=;
}
return ans;
} int main()
{
//freopen("a.in","r",stdin);
LL n,k;
scanf("%lld%lld",&n,&k);
cal_c(k);
LL ans=,f=,now;
for(LL i=k;i>=;i--)
{
now=(((c[i]*i)%mod)*pow(i-,n-))%mod;
ans=(ans+f*now+mod)%mod;
f=-f;
}
printf("%lld\n",ans);
return ;
}

[acmm week12]染色(容斥定理+组合数+逆元)的更多相关文章

  1. HDU 1796How many integers can you find(简单容斥定理)

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  2. UVA-11806 Cheerleaders 计数问题 容斥定理

    题目链接:https://cn.vjudge.net/problem/UVA-11806 题意 在一个mn的矩形网格里放k个石子,问有多少方法. 每个格子只能放一个石头,每个石头都要放,且第一行.最后 ...

  3. Codeforces Round #330 (Div. 2) B. Pasha and Phone 容斥定理

    B. Pasha and Phone Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/595/pr ...

  4. hdu_5213_Lucky(莫队算法+容斥定理)

    题目连接:hdu_5213_Lucky 题意:给你n个数,一个K,m个询问,每个询问有l1,r1,l2,r2两个区间,让你选取两个数x,y,x,y的位置为xi,yi,满足l1<=xi<=r ...

  5. How Many Sets I(容斥定理)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3556 How Many Sets I Time Limit: 2 ...

  6. HDU - 4135 Co-prime 容斥定理

    题意:给定区间和n,求区间中与n互素的数的个数, . 思路:利用容斥定理求得先求得区间与n互素的数的个数,设表示区间中与n互素的数的个数, 那么区间中与n互素的数的个数等于.详细分析见求指定区间内与n ...

  7. BZoj 2301 Problem b(容斥定理+莫比乌斯反演)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 7732  Solved: 3750 [Submi ...

  8. BZOJ2839 : 集合计数 (广义容斥定理)

    题目 一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集), 现在要在这 \(2^N\) 个集合中取出若干集合(至少一个), 使得它们的交集的元素个数为 \(K\) ,求取法的 ...

  9. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息

    项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...

  2. 解决zabbix使用中文是出现乱码的问题

       解决zabbix使用中文是出现乱码的问题 ①:上传windows的simhei.ttf字体到zabbix服务器的/usr/share/zabbix/fonts/目录下   ②:编辑/usr/sh ...

  3. IOC与DI(xml 配置)

    Spring可以帮助我们管理软件开发过程中的对象,以及如何创建和维护对象之间的关系. Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,可以将组建的耦合度降至最低,即实现解耦 ...

  4. java 基础 --集合--013

    1, contains()方法底层依赖的是equals()方法,而定义的类中没有equal()方法,所以它会使用父类Object中的equals()方法,而Object的equals()方法比较的是地 ...

  5. Java容器深入浅出之数组

    写在前面 关于Java的学习,特别是对于非计算机专业的同学来说,我总是主张从实践中来,到实践中去的学习方法.Java本身是一门应用性特别强的高级编程语言,因此如果能在基于实际开发的经验基础上,对Jav ...

  6. Spring Autowired原理

    今天来整理一下Spring的自动装配 autowire一节,在这里我们要解决以下问题: 什么是自动装配? 自动装配的意义? 自动装配有几种类型? 如何启用自动装配? 自动装配将引发的问题? 一.什么是 ...

  7. 【C++】C++ static关键字详解

    static的作用 1.隐藏 当我们编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其他的源文件也能访问.如,我们有源文件source1.cpp定义了一个全局变量i和函数Fu ...

  8. C++解析(10):struct和class的区别

    0.目录 1.默认访问级别 2.默认继承方式 2.1 分别独立继承 2.2 struct继承class 2.3 class继承struct 3.小结 1.默认访问级别 在用struct定义类时,所有成 ...

  9. Jsp遍历后台传过来的List

    1:使用jstl标签 (可以和自定义标签配合使用) 首先引用jstl标签 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" ...

  10. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...