题意
:在给出的n个不同长度中,选4根组成一个正三边形。
思路:
可必有两根相等,假设a=b>c>=d,暴力枚举a,c。
分两种情况:1. c==d,
for(int i = 2; i <= max1 ; i++)
for(int j = 1; j <= i / 2; j++) {
if(i == j * 2 && a[i] >= 2 && a[j] >= 2)
cnt += (a[i]) * (a[i] - 1) / 2 * (a[j]) * (a[j] - 1) / 2 % mod;
else if(i != j * 2 && a[i] >= 2 && a[j] >= 1 && a[i - j] >= 1)
cnt += (a[i]) * (a[i] - 1) / 2 * (a[j]) * a[i - j] % mod;
}
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 100000 + 10;
const int mod = 1e9 + 7;
long long a[maxn];
int main() {
long long n, m, cnt = 0;
cin >> n;
int max1 = 0;
while(n--) {
cin >> m;
a[m]++;
if(m > max1)
max1 = m;
}
for(int i = 2; i <= max1 ; i++)
for(int j = 1; j <= i / 2; j++) {
if(i == j * 2 && a[i] >= 2 && a[j] >= 2)
cnt += (a[i]) * (a[i] - 1) / 2 * (a[j]) * (a[j] - 1) / 2 % mod;
else if(i != j * 2 && a[i] >= 2 && a[j] >= 1 && a[i - j] >= 1)
cnt += (a[i]) * (a[i] - 1) / 2 * (a[j]) * a[i - j] % mod;
}
cout << cnt % mod << endl;
return 0;
}