题目描述
给定一个长度为 nn 的数列 aa,对于一个有序整数三元组 (i, j, k)(i,j,k),若其满足 1 \leq i \leq j \leq k \leq n1≤i≤j≤k≤n 并且 a_i +a_j = a_kai+aj=ak,则我们称这个三元组是「传智的」。
现在请你计算,有多少有序整数三元组是传智的。
输入格式
本题单测试点内有多组测试数据。
输入的第一行是一个整数 TT,表示数据组数。
对于每组数据:
第一行是一个整数,表示数列的长度 nn。
第二行有 nn 个整数,第 ii 个整数表示 a_iai。
输出格式
对于每组数据,输出一行一个整数表示答案。
输入输出样例
输入 #1
2
3
1 2 3
5
1 2 3 4 5
输出 #1
2
6
说明/提示
样例 1 解释
对于第一组数据,因为 a_1 + a_1 = a_2a1+a1=a2,a_1 + a_2 = a_3a1+a2=a3,故共 (1, 1, 2)(1,1,2) 和 (1, 2, 3)(1,2,3) 两个三元组。
对于第二组数据六个三元组分别是:
- (1, 1, 2)(1,1,2)
- (1, 2, 3)(1,2,3)
- (1, 3, 4)(1,3,4)
- (1, 4, 5)(1,4,5)
- (2, 2, 4)(2,2,4)
- (2, 3, 5)(2,3,5)
数据规模与约定
对于全部测试点,保证 1 \leq T \leq 1001≤T≤100,1 \leq n , a_i \leq 1001≤n,ai≤100,且各个测试点的 nn 之和不超过 100100,即 \sum n \leq 100∑n≤100。
vector:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
int T;
cin >> T;
int n;
vector<int> vec;
int a;
while (T--) {
int count = 0;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a;
vec.emplace_back(a);
}
//for (auto&& ve : vec) cout << ve << "/ ";
for (int z = 0; z < n; ++z) {
for (int i = z; i < n; ++i) {
for (int j = i; j < n; ++j) {
if (vec[z] + vec[i] == vec[j]) {
count++;
}
}
}
}
cout << count << endl;
vec.clear();
}
return 0;
}
数组:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
int T;
cin >> T;
int n;
int vec[105];
int a;
while (T--) {
int count = 0;
cin >> n;
for (int i = 1; i <= n; i++) cin >> vec[i];
for (int z = 1; z <= n; ++z)
for (int i = z; i <= n; ++i)
for (int j = i; j <= n; ++j)
if (vec[z] + vec[i] == vec[j])
count++;
cout << count << endl;
}
return 0;
}