Codeforces 100548F - Color (组合数+容斥)
题目链接:http://codeforces.com/gym/100548/attachments
有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案。
从m种颜色选k种颜色有C(m, k)种方案,对于k种颜色方案为k*(k-1)^(n-1)种。但是C(m, k)*k*(k-1)^(n-1)方案包括了选k-1,k-2...,2种方案。
题目要求刚好k种颜色,所以这里想到用容斥。
但是要是直接C(m, k)*k*(k-1)^(n-1) - C(m, k-1)*(k-1)*(k-2)^(n-1)的话,其实是多减的。
比如k=4,4种颜色1 2 3 4,有种染色方案是1 2 1 2,那么k-1的话1 2 3或者1 2 4也有染色方案是1 2 1 2,这里发现多减了。所以k-2还得加上。
所以公式就变成了
C(m, k)*( k*(k-1)^(n-1) - C(k, k-1)*(k-1)*(k-2)^(n-1) + C(k, k-2)*(k-2)*(k-3)^(n-1) ... )
中间的组合数C(k, i),可以用逆元来解决。C(m, k)则暴力即可。
1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <algorithm> 3 #include <iostream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cstdio> 7 #include <vector> 8 #include <cmath> 9 #include <ctime> 10 #include <list> 11 #include <set> 12 #include <map> 13 using namespace std; 14 typedef __int64 LL; 15 typedef pair <int, int> P; 16 const int N = 1e6+ 5; 17 LL mod = 1e9 + 7; 18 LL f[N]; 19 20 LL Pow(LL a , LL n , LL mod) { 21 LL res = 1; 22 while(n) { 23 if(n & 1) 24 res = res * a % mod; 25 a = a * a % mod; 26 n >>= 1; 27 } 28 return res; 29 } 30 31 LL Cnm(LL n, LL m, LL mod) { 32 if(n < N) { //数据范围小的 逆元就好了 33 return f[n]*Pow(f[m]*f[n-m]%mod, mod - 2, mod) % mod; 34 } 35 LL res = Pow(f[m]%mod, mod - 2, mod)%mod; 36 for(LL i = 0; i < m; ++i) { 37 res = res * (n-i) % mod; 38 } 39 return res%mod; 40 } 41 42 void init() { //阶乘预处理 43 f[0] = 1; 44 for(LL i = 1; i < N; ++i) 45 f[i] = f[i - 1] * i % mod; 46 } 47 48 int main() 49 { 50 init(); 51 int t; 52 LL n, m, k; 53 scanf("%d", &t); 54 for(int ca = 1; ca <= t; ++ca) { 55 scanf("%lld %lld %lld", &n, &m, &k); 56 printf("Case #%d: ", ca); 57 if(k == 1 && n == 1) { 58 printf("%lld\n", m); 59 continue; 60 } 61 else if(k == 1) { 62 printf("0\n"); 63 continue; 64 } 65 LL ans = 0, temp = k; 66 for(int i = 1; k >= 2; --k, i = -i) { 67 ans = (i * Cnm(temp, k, mod) % mod *k % mod* Pow(k- 1, n - 1, mod) % mod + ans) % mod; 68 } 69 ans = ans * Cnm(m, temp, mod) % mod; 70 printf("%lld\n", (ans + mod) % mod); 71 } 72 return 0; 73 }
View Code
之前纠结了好久...
转载于:https://www.cnblogs.com/Recoder/p/5773486.html
Codeforces 100548F - Color (组合数+容斥)相关推荐
- CodeForces 630K Indivisibility (容斥)
题目链接:http://codeforces.com/problemset/problem/630/K 题目大意 略 题目分析 把2到10的所有出现的质数都找出来, 对这个集合进行容斥即可. 因为其区 ...
- Codeforces 1342E Placing Rooks(容斥+组合数学)
题目链接:E. Placing Rooks 题意:给定一个N*棋盘,要求摆放n个rooks(国际象棋里能横竖走的那啥),使得每个格子都能被rooks攻击到,并且正好有k对rooks能相互攻击到,求有多 ...
- cf997C. Sky Full of Stars(组合数 容斥)
题意 题目链接 \(n \times n\)的网格,用三种颜色染色,问最后有一行/一列全都为同一种颜色的方案数 Sol Orz fjzzq 最后答案是这个 \[3^{n^2} - (3^n - 3)^ ...
- [CQOI2014]数三角形 组合数 + 容斥 + gcd
推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...
- [XSY] 简单的博弈题(博弈+dp+组合数+容斥)
简单的博弈题 对于贪心的对手,显然用最大的一半和他最小的一半比较判断是否全胜.(这不就是田忌赛马吗) 对于随机的对手,先考虑暴力怎么做: void check(int x,int w){if(x> ...
- [bzoj2839]集合计数 题解 (组合数+容斥)
Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模1000000007 ...
- F-子序列(组合数,打表,扩展欧拉,容斥)
题目链接 题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T,表示数据组数. 对于每组数据,第一行两个整数N,k ...
- CodeForces - 1486F Pairs of Paths(树上计数+容斥)
题目链接:点击查看 题目大意:给出一棵 nnn 个点的树,再给出 mmm 条路径,现在问有多少个路径对 (x,y)(x,y)(x,y),满足第 xxx 条路径和第 yyy 条路径有且仅有一个交点 题目 ...
- Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)
G. List Of Integers time limit per test 5 seconds memory limit per test 256 megabytes input standard ...
最新文章
- 最新公开的华为认证通关秘籍来了
- 把java 工程转为 maven 工程
- 两个弹窗相互切换(安卓苹果通用方法)
- React开发中使用fetch进行异步请求
- 董明珠上榜中国杰出商界女性100
- cydia源_Cydia错误提示解决大全
- C#调用新浪微博API生成RSS资源文件
- 网页右下角弹出窗体实现代码
- 新唐M261M262M263系列芯片知识总结归纳(2)
- erp系统与mes集成:制造业信息化发展中必不可少的阶段
- 通过计算机管理看主板型号,电脑主板型号在哪里看? 每日一答
- springboot集成快递100实现查询快递,面单打印;面单取消
- android中读取svg文件,Android如何加载SVG格式的矢量图
- 史上最强吃鸡电脑配件更新!这张显卡都能买一套房子了
- 大型网络之BGP路由通告路由传递配置
- Handler 源码解析——Handler的创建
- markdown 斜体、加粗、公式起止符快捷键
- 华裔科学家张首晟:个人数据完全由个人拥有
- https小灰锁(带黄色三角)如何变成安全的小绿锁
- Ubuntu 20.04 美化macos
热门文章
- Scala入门示例反编译分析代码执行流程
- jenkins pipeline、用户权限管理、插件下载地址更改、凭证管理、自由风格项目构建、maven项目构建、常用的构建触发器、邮件发送、SonarQube代码审查
- Scala mapValues踩坑记:谨慎使用Scala Map的mapValues, 你需要的可能是transform
- 【软考-软件设计师】程序语言的基本概念
- eclipse设置文档注释的格式
- C#访问MySQL数据库的方法
- 嵌入式实时操作系统的基本概念——μ/COS-II读书笔记
- ksql 数量大于2_A股史上唯一能暴涨200%的买卖铁则:内盘大于外盘股价必跌,外盘大于内盘股价必涨,堪称绝技...
- mysql停止服务命令_0789不停止MySQL服务重做备库的方法
- stm32之iap实现应用(基于串口,上位机,详细源码)