组合数+容斥原理 UVALive 7040 Color(14西安F)

题目传送门

题意:n盆花涂色,相邻不能涂相同的颜色,从m中颜色选取k种颜色涂,保证正好有k种颜色

分析:从m中颜色选取k种就是C (m, k),然后第一个有k种选择,之后的都有k-1种选择,这样是不超过k种颜色的方案,那么减去少了Ai颜色的方案数,用容斥原理,最后答案是C(m,k) × ( k × (k-1)^(n-1) + ∑((-1)^p × C(k, p) × p × (p-1)^(n-1) ) (2 <= p <= k-1);

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int EPS = 1e-8;
int inv[N];

void init(int n)	{
	inv[1] = 1;
	for (int i=2; i<=n; ++i)	{
		inv[i] = (MOD - MOD / i) * 1ll * inv[MOD%i] % MOD;		//inv[n]
	}
}

int pow_mod(int x, int n, int p)	{
	int ret = 1;
	while (n)	{
		if (n & 1)	ret = ret * 1l * x % p;
        x = x * 1ll * x % p;
        n >>= 1;
	}
	return ret;
}

int f(int n, int k)	{
	if (!k)	return 0;
	else	return k * 1ll * pow_mod (k-1, n-1, MOD) % MOD;
}

int main(void)	{
	init (1000000);
	int T, cas = 0;	scanf ("%d", &T);
	while (T--)	{
		int n, m, k;	scanf ("%d%d%d", &n, &m, &k);
		ll ans = 0;	int res = 1;
		for (int i=1; i<=k; ++i)	{
			res = res * 1ll * (k - i + 1) % MOD * inv[i] % MOD;
			if (k - i & 1)	{
				ans -= res * 1ll * f (n, i) % MOD;
				if (ans < 0)	ans += MOD;
			}
			else	{
				ans += res * 1ll * f (n, i) % MOD;
				if (ans >= MOD)	ans -= MOD;
			}
		}
		for (int i=1; i<=k; ++i)	{
			ans = ans * 1ll * (m - i + 1) % MOD * inv[i] % MOD;
		}
		printf ("Case #%d: %lld\n", ++cas, ans);
	}

	return 0;
}

  

时间: 2024-10-05 06:16:34

组合数+容斥原理 UVALive 7040 Color(14西安F)的相关文章

UVALive 7040 Color (容斥原理+逆元+组合数+费马小定理+快速幂)

题目:传送门. 题意:t组数据,每组给定n,m,k.有n个格子,m种颜色,要求把每个格子涂上颜色且正好适用k种颜色且相邻的格子颜色不同,求一共有多少种方案,结果对1e9+7取余. 题解: 首先可以将m 与后面的讨论分离.从m 种颜色中取出k 种颜色涂色,取色部分有C(m, k) 种情况: 然后通过尝试可以发现,第一个有k种选择,第二个因不能与第一个相同,只有(k-1) 种选择,第三个也只需与第二个不同,也有(k-1) 种选择.总的情况数为k ×(k-1)^(n-1).但这仅保证了相邻颜色不同,总

UVALive 4025 Color Squares(BFS)

题目链接:UVALive 4025 Color Squares 按题意要求涂色,求达到w分的最少步数. //yy:哇,看别人存下整个棋盘的状态来做,我什么都不想说了,不知道下午自己写了些什么东西,训练结束补的.. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define CLR(a, b) memset((a),(b),sizeof

14西安区域赛总结帖

14西安区域赛总结帖 ACM 第一次打区域赛,终于可以好好地写一篇总结帖了. 总结帖=口水帖?差不多吧.(在我离开的时候发生了些事情,我现在心情不是很好,我就随便水水吧) 文章结构就用总分总吧. 西安之行在各个方面让我涨了不少姿势. 这次的比赛个人感觉还不错,至少没有发挥失常,而且顺利拿到了铜牌.(感动ing,其实已经做好了打铁的准备,多谢学妈.表妹.zlx.wjx等童鞋的赛前加的buff) 出发前. 比赛前这阶段是非常忙的,要应付各种事情.但是我还是腾出了很多时间来准备比赛,说是准备其实是临时

Uva 7040 color(组合数)

题意:n个球有m种颜色可选,使用k种不同的颜色,求方案数: 思路:Cm[k]表示m中选k,方案数为Cm[k]*(k*(k-1)^(n-1)-sigma(p*(p-1)^(n-1))(1<=p<k)); #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MOD 1000000007 int t,n,m,k; long long ck[50001

hdu--5155Harry And Magic Box(组合数+容斥原理)

Harry And Magic Box Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2015-01-07) Description One day, Harry got a magical box. The box is made of n*m grids. There are sp

UVA1625 / UVALive 5841 Color Length DP

简单DP,dp[i][j]表示从第一个序列里取出i个和从第j个序列里取出j个的组合的最小值,可以从两个方向转移过来,每次转移加上已经出现过的且还没有出现完的字母的个数. O(n?m)的复杂度. 1625 Color Length Cars painted in different colors are moving in a row on the road as shown in Figure 1. The color of each car is represented by a single

UVALive 7148 LRIP 14年上海区域赛K题 树分治

题意 n个点组成一棵树, 带有点权. 求最长不降的路径的长度, 且路径上最大值最小值之差不超过D. 显然是树分治, 但是分治之后如何维护答案呢. 假设当前重心为g, 分别记录g出发不降路径的长度,以及最大值, 和不升路径的长度以及最小值. 这里用到一个map和二分, 线段树也可以, 但是如果用线段树还要考虑负值, 再加上线段树的clear以及稍微暴力的查询.  常数大小不好说. 1 #include <bits/stdc++.h> 2 using namespace std; 3 typede

组合数取模(转载)

本文转自:http://blog.csdn.net/skywalkert/article/details/52553048 0. 写在前面 在程序设计中,可能会碰到多种类型的计数问题,其中不少涉及到组合数的计算,所以笔者写下这么一篇文章,期望能解决一些常规的组合数求模问题.以下部分内容改编自AekdyCoin的<组合数求模>,而且为了感谢他对(懵懂的)笔者的启发,这篇文章的标题与其文章相同.另外,感谢Picks将多项式运算的技巧在中国进行推广,感谢51nod提供了许多有趣的数论题目,感谢fot

[BZOJ 1042] 硬币购物 容斥原理

题意 有四种货币, 它们的价值分别是 c[0], c[1], c[2], c[3] . n 次询问, 每次给定 d[0], d[1], d[2], d[3], s, 问凑出 s , 且第 i 种货币不超过 c[i] 个的方案数. c[i], d[i], s <= 100000 , n <= 1000 . 分析 设第 i 种货币取了 x[i] 个. 问题转化为求不定方程 c[0]x[0] + c[1]x[1] + c[2]x[2] + c[3]x[3] = s 的非负整数解的个数. 且满足 4