CF1822G1 题解

洛谷传送门 & CF 传送门

思路

这题我们可以定义一个 STL 中的 map,mpimp_i 表示数字 ii 出现的次数。如果 ii 是任意一个数 bb 的平方 b2b^2 的倍数(b2b\ge2),那 iiib\frac ibib2\frac i{b^2}33 个数能组成 mpi×mpib×mpib2mp_i\times mp_\frac ib\times mp_\frac i{b^2} 组数。还有一种情况,就是在 mpi3mp_i\ge3 时,iiiiii 这三个数可以组成 mpi×(mpi1)×(mpi2)mp_i\times(mp_i-1)\times(mp_i-2) 组数。

注意事项

记得开 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; //结束程序
}
posted @ 2023-08-03 14:27  Vitamin_B  阅读(10)  评论(0)    收藏  举报  来源