2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)
题目链接:传送门
题意:
n个格子排成一行。我们有m种颜色。能够给这些格子涂色,保证相邻的格子的颜色不同
问,最后恰好使用了k种颜色的方案数。
分析:
看完题目描写叙述之后立刻想到了一个公式 :C(m,k)*k*(k-1)^(n-1),可是细致分析了一下
这个公式的含义是相邻的格子颜色不同,使用的颜色总数小于等于k的方案数,可是这个
公式能够帮忙我们衍生出来以下的公式。C(k,x)*x*(x-1)^(n-1),这个公式的含义是在这
k种颜色中再选出来x种使得相邻的格子不同色最后的颜色数小于等于x,然后每个集合
都有交们我们能够考虑用容斥来搞一下。
设 S = F[x]=C(k,x)*x*(x-1)^(n-1);
ans = C(m,k) * sigma{ (-1)^(k-i) * C(k,i) * i *(i - 1)^(n-1)} (1 <= i <= k)
代码例如以下:
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- using namespace std;
- typedef long long LL;
- const LL mod = 1e9+7;
- const int maxn = 1e6+10;
- LL n,m,k;
- LL c[maxn],inv[maxn];
- LL quick_mod(LL a,LL b){
- LL ans=1;
- while(b){
- if(b&1) ans=ans*a%mod;
- b>>=1;
- a=a*a%mod;
- }
- return ans ;
- }
- inline LL get_inverse(LL x){ //(a/b) % c = a*inv[b] %c if(c is a prime number) inv[b] = (b^(c-2))%c;
- return quick_mod(x,mod-2);
- }
- void init(){//将[1,1e6+10]的逆元预处理出来
- for(LL i=1;i<maxn;i++)
- inv[i]=get_inverse(i);
- }
- void get_combine(LL n){//得到组合数
- c[0]=1;
- for(LL i=1;i<=k;i++){
- c[i]=(c[i-1]*(n-i+1)%mod)*inv[i]%mod;
- }
- }
- inline LL calc(LL x){// x*C(k,x)*(x-1)^(n-1)
- return (c[x]*x%mod)*quick_mod(x-1,n-1)%mod;
- }
- int main(){
- init();
- int t,cas=1;
- scanf("%d",&t);
- while(t--){
- scanf("%lld%lld%lld",&n,&m,&k);
- get_combine(m);
- LL ans = c[k],ans1=0,tag=1;
- get_combine(k);
- for(LL i=k;i>=1;i--){
- ans1=(ans1+tag*calc(i)+mod)%mod;
- tag=-tag;
- }
- ans=ans*ans1%mod;
- printf("Case #%d: %lld\n", cas++, ans);
- }
- return 0;
- }
2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)的更多相关文章
- 2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)
题意:小球排成一排,从m种颜色中选取k种颜色给n个球上色,要求相邻的球的颜色不同,求可行的方案数,答案模1e9+7.T组数据,1<= n, m <= 1e9, 1 <= k < ...
- 2014ACM/ICPC亚洲区西安站 复旦命题
http://codeforces.com/gym/100548 A 签到 问一个序列是不是yes,yes的序列满足每个数都是3的倍数. #include<cstdio> int main ...
- 2014ACM/ICPC亚洲区鞍山站 清华命题
A http://acm.hdu.edu.cn/showproblem.php?pid=5070 先跳过. B http://acm.hdu.edu.cn/showproblem.php?pid=50 ...
- 2014ACM/ICPC亚洲区牡丹江站 浙大命题
A Average Score http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5373 a班有n个人,b班有m个人,bob在a ...
- 2016 ACM/ICPC亚洲区大连站 F - Detachment 【维护前缀积、前缀和、二分搜索优化】
F - Detachment In a highly developed alien society, the habitats are almost infinite dimensional spa ...
- HDU 5127.Dogs' Candies-STL(vector)神奇的题,set过不了 (2014ACM/ICPC亚洲区广州站-重现赛(感谢华工和北大))
周六周末组队训练赛. Dogs' Candies Time Limit: 30000/30000 MS (Java/Others) Memory Limit: 512000/512000 K ( ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- 2016ACM/ICPC亚洲区大连站现场赛题解报告(转)
http://blog.csdn.net/queuelovestack/article/details/53055418 下午重现了一下大连赛区的比赛,感觉有点神奇,重现时居然改了现场赛的数据范围,原 ...
- (HDU 5558) 2015ACM/ICPC亚洲区合肥站---Alice's Classified Message(后缀数组)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5558 Problem Description Alice wants to send a classi ...
随机推荐
- js模板引擎--artTemplate
js模板引擎--artTemplate 以前研究过一段时间的handlebars,但因为其渲染性能略逊于腾讯的artTemplate(在artTemplate的GitHub官网上有推荐的性能测试地址) ...
- 鼠标进入与离开的消息(使用CM_MOUSEENTER来判断是否进入控件)
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ...
- 基于visual Studio2013解决C语言竞赛题之1071打印工资
题目 解决代码及点评 /************************************************************************/ /* ...
- MFC模板CArray及其派生类
CArray及其派生类 1. 简介:访问方法及效率和普通的数组一样,比普通数组强大的功能是可以改变数组的大小.Array采用队列方式存储数据,因而其内部数据元素是以物理方式顺序排列的,所以检索.顺序执 ...
- Andorid Binder进程间通信---总结
一.Server和Service Manager进程间通信 Service Manager进程启动时,已经创建了Service Manager实体对象,没有Service Manager本地对象. S ...
- Python WxPython 的安装以及使用
WxPython 网址 学习网址 http://wiki.wxpython.org/How%20to%20Learn%20wxPython 安装网址 http://wiki.wxpython.org/ ...
- Delphi的DLL里如何实现定时器功能?
一,首先引入“mmsystem”单元. 二,启动定时器: var MMTimerID: Integer; // 定时器ID MMTimerID := timeSetEvent(1000, 0, @Ti ...
- 微信支付[v3]
原文:微信支付[v3] V2升级V3 顺便记录一下 ,文档: http://pay.weixin.qq.com/wiki/doc/api/index.html !!! 支付授权目录与测试人的微信帐号白 ...
- 基于visual Studio2013解决面试题之0402合并升序链表并去重
题目
- Swift - 项目部署配置(支持的系统,设备和状态条样式等)
点击项目,在General选项卡中的“Deployment Info”栏目中可以进行一些项目的配置 Deployment Target:支持的iOS SDK的最低版本 Device:所支持的设备(iP ...