题目链接: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 (组合数+容斥)相关推荐

  1. CodeForces 630K Indivisibility (容斥)

    题目链接:http://codeforces.com/problemset/problem/630/K 题目大意 略 题目分析 把2到10的所有出现的质数都找出来, 对这个集合进行容斥即可. 因为其区 ...

  2. Codeforces 1342E Placing Rooks(容斥+组合数学)

    题目链接:E. Placing Rooks 题意:给定一个N*棋盘,要求摆放n个rooks(国际象棋里能横竖走的那啥),使得每个格子都能被rooks攻击到,并且正好有k对rooks能相互攻击到,求有多 ...

  3. cf997C. Sky Full of Stars(组合数 容斥)

    题意 题目链接 \(n \times n\)的网格,用三种颜色染色,问最后有一行/一列全都为同一种颜色的方案数 Sol Orz fjzzq 最后答案是这个 \[3^{n^2} - (3^n - 3)^ ...

  4. [CQOI2014]数三角形 组合数 + 容斥 + gcd

    推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...

  5. [XSY] 简单的博弈题(博弈+dp+组合数+容斥)

    简单的博弈题 对于贪心的对手,显然用最大的一半和他最小的一半比较判断是否全胜.(这不就是田忌赛马吗) 对于随机的对手,先考虑暴力怎么做: void check(int x,int w){if(x> ...

  6. [bzoj2839]集合计数 题解 (组合数+容斥)

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

  7. F-子序列(组合数,打表,扩展欧拉,容斥)

    题目链接 题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T,表示数据组数. 对于每组数据,第一行两个整数N,k ...

  8. CodeForces - 1486F Pairs of Paths(树上计数+容斥)

    题目链接:点击查看 题目大意:给出一棵 nnn 个点的树,再给出 mmm 条路径,现在问有多少个路径对 (x,y)(x,y)(x,y),满足第 xxx 条路径和第 yyy 条路径有且仅有一个交点 题目 ...

  9. 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 ...

最新文章

  1. 最新公开的华为认证通关秘籍来了
  2. 把java 工程转为 maven 工程
  3. 两个弹窗相互切换(安卓苹果通用方法)
  4. React开发中使用fetch进行异步请求
  5. 董明珠上榜中国杰出商界女性100
  6. cydia源_Cydia错误提示解决大全
  7. C#调用新浪微博API生成RSS资源文件
  8. 网页右下角弹出窗体实现代码
  9. 新唐M261M262M263系列芯片知识总结归纳(2)
  10. erp系统与mes集成:制造业信息化发展中必不可少的阶段
  11. 通过计算机管理看主板型号,电脑主板型号在哪里看? 每日一答
  12. springboot集成快递100实现查询快递,面单打印;面单取消
  13. android中读取svg文件,Android如何加载SVG格式的矢量图
  14. 史上最强吃鸡电脑配件更新!这张显卡都能买一套房子了
  15. 大型网络之BGP路由通告路由传递配置
  16. Handler 源码解析——Handler的创建
  17. markdown 斜体、加粗、公式起止符快捷键
  18. 华裔科学家张首晟:个人数据完全由个人拥有
  19. https小灰锁(带黄色三角)如何变成安全的小绿锁
  20. Ubuntu 20.04 美化macos

热门文章

  1. Scala入门示例反编译分析代码执行流程
  2. jenkins pipeline、用户权限管理、插件下载地址更改、凭证管理、自由风格项目构建、maven项目构建、常用的构建触发器、邮件发送、SonarQube代码审查
  3. Scala mapValues踩坑记:谨慎使用Scala Map的mapValues, 你需要的可能是transform
  4. 【软考-软件设计师】程序语言的基本概念
  5. eclipse设置文档注释的格式
  6. C#访问MySQL数据库的方法
  7. 嵌入式实时操作系统的基本概念——μ/COS-II读书笔记
  8. ksql 数量大于2_A股史上唯一能暴涨200%的买卖铁则:内盘大于外盘股价必跌,外盘大于内盘股价必涨,堪称绝技...
  9. mysql停止服务命令_0789不停止MySQL服务重做备库的方法
  10. stm32之iap实现应用(基于串口,上位机,详细源码)