CF1822G1 题解
思路
这题我们可以定义一个 STL 中的 map, 表示数字 出现的次数。如果 是任意一个数 的平方 的倍数(),那 、、 这 个数能组成 组数。还有一种情况,就是在 时,、、 这三个数可以组成 组数。
注意事项
记得开 long long!
代码
//CF1822G1
# include <bits/stdc++.h> //万能头
typedef long long ll;
using namespace std;
ll t, n, x, sum;
map <ll, ll> mp;
int main () {
cin >> t;
while (t --) { //多组数据通用写法
cin >> n;
mp.clear (), sum = 0; //多组数据要清空
while (n --) {
cin >> x;
++ mp[x];
}
for (auto i = mp.begin (); i != mp.end (); ++ i) { //map 的遍历方式
sum += i->second * (i->second - 1) * (i->second - 2); //b=1 的情况
for (int j = 2; j * j <= i->first; ++ j) //枚举到根号就够了
if (! (i->first % (j * j))) //能整除
sum += i->second * mp[i->first / j] * mp[i->first / j / j];
}
cout << sum << '\n';
}
return 0; //结束程序
}

浙公网安备 33010602011771号