题意 :
- 给出一个长为n的数组,求有多少对(i ,j ,k)满足 ai * aj == ak,n < 1e6,下标没有顺序。
思路 :
// 解法1 1e6 * (1 + 1/2 + 1/3 + ... + 1/1e6) == 14 * 1e6
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_map>
#define endl '\n'
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int a[N];
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n;
cin >> n;
for (int i = 0; i < n; i ++ )
{
int x;
cin >> x;
a[x] ++ ;
}
LL ans = 0;
for (int i = 1; i <= 1000000; i ++ )
for (int j = 1; j <= 1000000 / i; j ++ )
ans += a[i] * a[j] * a[i * j];
cout << ans << endl;
return 0;
}
// 解法2
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <set>
#define endl '\n'
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int a[N];
int main()
{
IOS;
int n;
cin >> n;
set<int> se;
for (int i = 0; i < n; i ++ )
{
int x;
cin >> x;
se.insert(x);
a[x] ++ ;
}
LL ans = 0;
for (auto i : se)
{
for (int j = i; j <= 1000000 / i; j ++ )
if (a[j])
if (i != j)
ans += a[i] * a[j] * a[i * j] * 2;
else
ans += a[i] * a[j] * a[i * j];
}
cout << ans << endl;
return 0;
}