专栏文章

题解:P14262 [ROI 2015 Day1] 自动好友

P14262题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mink5dbm
此快照首次捕获于
2025/12/02 03:44
3 个月前
此快照最后确认于
2025/12/02 03:44
3 个月前
查看原文
本题考查对组合数的应用。

题目描述

一共有 nn 个人,每个人分别有 33 个特征值,求有几组人只有一个特征值相同。

思路

仔细研究题目数据,不难发现特征值都小于等于 100100 这就给了我们一个很大的启发,那就是我们可以利用数组分别记录有一个特征值相同,两个特征值相同,三个特征值相同的人数,然后可以运用组合数公式算出一共有多少种组合。最后我们再仔细推一下答案公式,不难发现,答案就是一个特征值相同的组合数,减去两倍的两个特征值相同的组合数,再加上三倍的三个特征值都相同的组合数。以上就是答案。

Code

CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
long long check(long long n) {
	return n * (n - 1) / 2;
}//算出组合数
int a[101], b[101], c[101], ab[101][101], ac[101][101], bc[101][101], abc[101][101][101];
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		int a1, b1, c1;
		cin >> a1 >> b1 >> c1;
		a[a1] ++;
		b[b1] ++;
		c[c1] ++;
		ab[a1][b1] ++;
		ac[a1][c1] ++;
		bc[b1][c1] ++;
		abc[a1][b1][c1] ++;
	}
	int cnt1, cnt2, cnt3;
	cnt1 = cnt2 = cnt3 = 0;
	for(int i = 1; i <= 100; i ++){
		cnt1 += check(a[i]) + check(b[i]) + check(c[i]);
	}
	for(int i = 1; i <= 100; i ++){
		for(int j = 1; j <= 100; j ++){
			cnt2 += check(ab[i][j]) + check(ac[i][j]) + check(bc[i][j]);
		}
	}
	for(int i = 1; i <= 100; i ++){
		for(int j = 1; j <= 100; j ++){
			for(int k = 1; k <= 100; k ++){
				cnt3 += check(abc[i][j][k]);
			}
		}
	}
	cout << cnt1 - cnt2 * 2 + cnt3 * 3;//核心公式
	return 0;
}
恭喜你,又做完一道黄题。

评论

1 条评论,欢迎与作者交流。

正在加载评论...