【nowcoder 217043】CCA的小球

CCA的小球

题目链接:nowcoder 217043

到牛客看:

——>点我跳转<——

题目大意

有 n 个球,每个球有颜色,最多两个球同一个颜色,你要把它们排成一列。
求有多少个方案满足相邻的球颜色都不同。
方案不同当且仅当某个位置两个方案摆在这里的球颜色不同。

思路

我们考虑从同一个颜色最多两个小球下手。

那对于两个同颜色的小球,就有相邻和不相邻两种。

而且我们想到看有多少个是相邻的。
但是恰好又不好搞,我们看至少有多少个相邻。

那就好弄了,先排列弄选哪 i i i 个颜色捆在一起,然后就是:
C t o t i × ( n − i ) ! / 2 t o t − i C_{tot}^{i}\times(n-i)!/2^{tot-i} Ctoti×(ni)!/2toti
t o t tot tot 是一共有多少种颜色有两个球,下同)

那我们可以想到用容斥来去重,至少零个减至少一个加至少两个……,以此类推。

那我们可以总结出完整的式子:
a n s = ∑ i = 0 t o t ( ( − 1 ) i × C t o t i × ( n − i ) ! / 2 t o t − i ) ans=\sum\limits_{i=0}^{tot}((-1)^i\times C_{tot}^i\times (n-i)!/2^{tot-i}) ans=i=0tot((1)i×Ctoti×(ni)!/2toti)

然后把一些东西预处理一下算这个式子就好了。

代码

#include<cstdio>
#include<algorithm>
#define ll long long
#define mo 1000000007

using namespace std;

int n, a[1000001];
int two;
ll ans, two_times[1000001], inv[1000001], fac[1000001], zf = 1;

ll ksm(ll x, ll y) {//用来算逆元的
	ll re = 1;
	while (y) {
		if (y & 1) re = (re * x) % mo;
		x = (x * x) % mo;
		y >>= 1;
	}
	return re;
}

void init() {//预处理
	two_times[0] = inv[0] = fac[0] = 1;
	for (int i = 1; i <= 1000000; i++) two_times[i] = (two_times[i - 1] * 2) % mo;
	for (int i = 1; i <= 1000000; i++) fac[i] = (fac[i - 1] * i) % mo;
	inv[1000000] = ksm(fac[1000000], mo - 2);
	for (int i = 1000000 - 1; i >= 0; i--) inv[i] = (inv[i + 1] * (i + 1)) % mo;
}

int main() {
	init();
	
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	
	sort(a + 1, a + n + 1); 
	
	for (int i = 2; i <= n; i++)
		if (a[i] == a[i - 1]) {
			two++;
		}
	
	for (int i = 0; i <= two; i++) {//根据式子容斥
		ans = (ans + zf * (fac[two] * inv[i] % mo * inv[two - i] % mo * fac[n - i] % mo * ksm(two_times[two - i], mo - 2)) % mo) % mo;
		if (ans < 0) ans += mo;
		zf = -zf;
	}
	
	printf("%lld", ans);
	
	return 0;
}
已标记关键词 清除标记
相关推荐
程序员的必经之路! 【限时优惠】 现在下单,还享四重好礼: 1、教学课件免费下载 2、课程案例代码免费下载 3、专属VIP学员群免费答疑 4、下单还送800元编程大礼包 【超实用课程内容】  根据《2019-2020年中国开发者调查报告》显示,超83%的开发者都在使用MySQL数据库。使用量大同时,掌握MySQL早已是运维、DBA的必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入的了解和掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺的技能!   套餐中一共包含2门MySQL数据库必学的核心课程(共98课时)   课程1:《MySQL数据库从入门到实战应用》   课程2:《高性能MySQL实战课》   【哪些人适合学习这门课程?】  1)平时只接触了语言基础,并未学习任何数据库知识的人;  2)对MySQL掌握程度薄弱的人,课程可以让你更好发挥MySQL最佳性能; 3)想修炼更好的MySQL内功,工作中遇到高并发场景可以游刃有余; 4)被面试官打破沙锅问到底的问题问到怀疑人生的应聘者。 【课程主要讲哪些内容?】 课程一:《MySQL数据库从入门到实战应用》 主要从基础篇,SQL语言篇、MySQL进阶篇三个角度展开讲解,帮助大家更加高效的管理MySQL数据库。 课程二:《高性能MySQL实战课》主要从高可用篇、MySQL8.0新特性篇,性能优化篇,面试篇四个角度展开讲解,帮助大家发挥MySQL的最佳性能的优化方法,掌握如何处理海量业务数据和高并发请求 【你能收获到什么?】  1.基础再提高,针对MySQL核心知识点学透,用对; 2.能力再提高,日常工作中的代码换新貌,不怕问题; 3.面试再加分,巴不得面试官打破沙锅问到底,竞争力MAX。 【课程如何观看?】  1、登录CSDN学院 APP 在我的课程中进行学习; 2、移动端:CSDN 学院APP(注意不是CSDN APP哦)  本课程为录播课,课程永久有效观看时长 【资料开放】 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化。  下载方式:电脑登录课程观看页面,点击右侧课件,可进行课程资料的打包下载。
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页