【ETOJ P1014】straax'aks Array 题解(多重循环+暴力枚举+位运算)

63 阅读2分钟

题目描述

给定一个长度为 nn 的数组 aa 和一个整数 mm,问数组中有多少个三元组 (i,j,k)(i,j,k),满足:

  1. i<j<ki < j < k
  2. (ai+aj+ak)×(aiajak)m(a_i + a_j + a_k) \times (a_i \oplus a_j \oplus a_k) \ge m

输入格式

第一行两个整数 n,mn, m(1n500,1m109)(1 \le n \le 500, 1 \le m \le 10^9)

接下来一行 nn 个整数,第 ii 个数字表示 aia_i(1ai109)(1 \le a_i \le 10^9)

输出格式

一个整数,表示满足条件的三元组个数。

样例输入1

4 10
1 3 2 5

样例输出1

3

解释

共有3个三元组满足条件:(1,2,4)(1,2,4), (1,3,4)(1,3,4), (2,3,4)(2,3,4)

提示

记得开 longlong。


思路

计算满足特定条件的三元组的数量。这个特定条件是数组中任意三个元素的和乘以这三个元素的异或结果大于或等于给定的数值mm

NN 是数组的最大长度,nnmm 是用户输入的值,分别代表数组的实际长度和要比较的数值。aa 是存储用户输入数组的变量,ansans 用来记录满足条件的三元组的数量。

main 函数中,程序首先通过 cin 读取用户输入的 nnmm 的值,然后读取 nn 个数值存入数组 aa 中。

数据范围不大,直接暴力枚举。通过三层嵌套的 for 循环遍历数组中的所有可能的三元组。对于每一个三元组,程序计算它们的和乘以它们的异或结果,然后判断这个值是否大于或等于 mm。如果满足条件,就将 ansans 的值加一。

最后,程序通过 cout 输出 ansans 的值,这就是满足条件的三元组的数量。

这个算法的时间复杂度是 O(n3)O(n^3),因为它需要遍历数组中所有可能的三元组。

注意:记得开 long long,不然会报答案错误 AC:17%


AC代码

#include <iostream>
#define ll long long
#define AUTHOR "HEX9CF"
using namespace std;

const int N = 1e7 + 7;

ll n, m;
ll a[N];
ll ans;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	ans = 0;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		for (int j = i + 1; j <= n; j++) {
			for (int k = j + 1; k <= n; k++) {
				if ((a[i] + a[j] + a[k]) * (a[i] ^ a[j] ^ a[k]) >= m) {
					ans++;
				}
			}
		}
	}
	cout << ans << endl;
	return 0;
}