Gym 100548F Color 2014-2015 ACM-ICPC, Asia Xian Regional Contest (容斥原理+大数取模)
题意:有N朵花,在M种颜色中选择恰好k种不同的颜色,将这N朵花染色,要求相邻的两朵花颜色不相同.
分析:若限制改为选择不超过k种颜色将N朵花朵染色,则方案数\(f(N,k) = k*(k-1)^{N-1}\),第一朵可以在k个颜色中任意选择,第二朵可以有k-1个选择,第三朵也有k-1....
但是f(N,k)种方案中包含了使用了少于k个颜色的方案数,要减去这些方案数.设没有使用的颜色数为i,当i=1时,减去只使用1种颜色的方案数\(C(k,1)*f(N,k-1)\);当i=2时,方案数已经被i=1时重复减去了一遍,所以要加回... 根据容斥原理,需要减去的方案数为
\]
\(f(N,k) - tmp\)得到用k种颜色染色的方案.
因为k种颜色是在M种颜色中任选,所以最后的答案是
\]
因为该题M和N很大,所以最后一步的组合数需要用卢卡斯取模.
中间过程的\(C(k,i),k\)恒定,因为\(k\leq 1e6\),可以预处理出阶乘的逆元,对每组数据,\(O(k)\)处理出所有k为底的组合数.
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1e6+5;
LL mod = 1e9+7;
LL fac[MAXN], inv[MAXN];
LL Comb[MAXN];
LL qpow(LL x, LL n, LL p)
{
LL res=1;
while(n){
if(n&1) res= res *x % p;
x= x*x %p;
n>>=1;
}
return res;
}
void pre()
{
fac[0] = fac[1] = 1;
for(int i = 2;i<MAXN; ++i){
fac[i] = i*fac[i-1] %mod;
}
inv[MAXN-1] = qpow( fac[MAXN-1], mod-2 ,mod);
for(int i= MAXN-2; i>=0; --i){
inv[i] = (i+1) * inv[i+1] % mod;
}
}
void pre_Ck(LL k)
{
LL pt = 1;
for(int i=1 ;i<=k ;++i) pt = pt * i % mod;
for(int i=0 ;i<=k ;++i){
Comb[i] = pt * inv[i] %mod * inv[k-i] %mod;
}
}
LL C (LL a, LL b, LL p) {
if (a < b) return 0;
if (b > a - b) b = a - b;
LL up = 1, down = 1;
for (LL i = 0; i < b; i++) {
up = up * (a-i) % p;
down = down * (i+1) % p;
}
return up * qpow(down, p-2, p) % p; // 逆元
}
LL lucas (LL a, LL b, LL p) { //卢卡斯组合数取模
if (b == 0)
return 1;
return C(a%p, b%p, p) * lucas(a/p, b/p, p) % p;
}
LL f(LL n , LL k)
{
return k * qpow(k-1,n-1,mod) %mod;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
LL N,M,k;
pre();
int T,cas=1; scanf("%d", &T);
while(T--){
scanf("%lld %lld %lld",&N, &M ,&k);
pre_Ck(k);
LL res = f(N,k);
LL tmp =0;
for(int i= 1;i<=k-2;++i){
if(i&1 ) tmp = (tmp + Comb[i] * f(N,k-i) %mod) %mod;
else tmp = (tmp + mod - Comb[i]* f(N,k-i) %mod) %mod;
}
res = (res + mod - tmp) % mod * lucas(M, k, mod) %mod;
printf("Case #%d: %lld\n",cas++,res);
}
return 0;
}
Gym 100548F Color 2014-2015 ACM-ICPC, Asia Xian Regional Contest (容斥原理+大数取模)的更多相关文章
- hdu 5444 Elven Postman(二叉树)——2015 ACM/ICPC Asia Regional Changchun Online
Problem Description Elves are very peculiar creatures. As we all know, they can live for a very long ...
- (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )
http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) Memo ...
- (二叉树)Elven Postman -- HDU -- 54444(2015 ACM/ICPC Asia Regional Changchun Online)
http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limit: 1500/1000 MS (Java/Others) ...
- 2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków
ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków Problem A: Rubik’s Rect ...
- 2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)
2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) easy: ACE ...
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest(部分题解)
摘要 本文主要给出了2014-2015 ACM-ICPC, Asia Xian Regional Contest的部分题解,说明了每题的题意.解题思路和代码实现,意即熟悉区域赛比赛题型. Built ...
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest G The Problem to Slow Down You 回文树
The Problem to Slow Down You Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjud ...
- HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...
随机推荐
- Struts2_day02--Action获取表单提交数据
Action获取表单提交数据 1 之前web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParameter,getParameterMap 2 ...
- laravel 调试模式及日志配置
1)调试模式和日志的配置都在 config/app.php 配置文件中 2)打开调试模式 'debug' => env('APP_DEBUG', true) 3)laravel的日志默认已经打开 ...
- OSG设置警告等级
osg::setNotifyLevel(osg::FATAL);//控制台只输出严重错误信息
- Perfmon - Windows 自带系统监测工具
本文转载自oscar999 一. 简述 可以用于监视CPU使用率.内存使用率.硬盘读写速度.网络速度等. Perfmon提供了图表化的系统性能实时监视器.性能日志和警报管理,系统的性能日志可定义为二进 ...
- std::ostringstream
ostringstream是C++的一个字符集操作模板类,定义在sstream.h头文件中.ostringstream类通常用于执行C风格的串流的输出操作,格式化字符串,避免申请大量的缓冲区,替代sp ...
- DEDE的搜索页面支持arclist和channelartlist标签的操作方法
很多朋友在使用dedecms进行网站开发时都会存在这样的问题,那就是dedecms的搜索页(search.php)与我们网站页面的模板的头 部.底部不一样,并且还不支持在搜索页调用其他某一栏目的文档. ...
- Codeforces Round #427 (Div. 2)—A,B,C,D题
A. Key races 题目链接:http://codeforces.com/contest/835/problem/A 题目意思:两个比赛打字,每个人有两个参数v和t,v秒表示他打每个字需要多久时 ...
- Codeforces Round #426 (Div. 2)A题&&B题&&C题
A. The Useless Toy:http://codeforces.com/contest/834/problem/A 题目意思:给你两个字符,还有一个n,问你旋转n次以后从字符a变成b,是顺时 ...
- 微信公众号获取用户openId How to use cURL to get jSON data and decode the data?
w http://stackoverflow.com/questions/16700960/how-to-use-curl-to-get-json-data-and-decode-the-data
- Storm-源码分析- Messaging (backtype.storm.messaging)
先定义两个接口和一个类 TaskMessage类本身比较好理解, 抽象storm的message格式 对于IContext, 注释也说了, 定义messaging plugin, 通过什么渠道去发送m ...