题意:n个数ai,求有多少对ai相乘之后能变成某数的k次方的形式。
可以想到某数的k次方可以表示成多种质因子的k次方的乘积(例:6^3 = 2^3 * 3^3 ),
进一步想,如果对于每个ai我们都按照因子从小到大(不用管质不质因子了,即我们按照同一套分离方法分离所有ai)将 他表示成多个因子的乘积,
如果两个ai乘起来能表达成多个因子的k次方乘积,那么这两个ai分离出的每个因子都是相等的,且每个因子分离出的次数相加等于k。

那么我们就把每个ai分离的情况记录下来,这里怎么记录要灵活运用stl,
int main()
{
	ll ans = 0;
	int n, k;rd(n),rd(k);
	map<vector<pair<int, int>>, int> cnt;
	while (n--)
	{
		int a;rd(a);
		vector<pair<int, int>> now, nnow;
		for (int jd = 2; jd * jd <= a; jd++)
		{
			int cnt_jd = 0;
			while (a % jd == 0)
				cnt_jd = (cnt_jd + 1) % k,a /= jd;
			if (cnt_jd)
				now.push_back({jd, cnt_jd});
		}
		if (a > 1)//如果a还有剩余这里就是一次方
			now.push_back({a, 1});
		for (pair<int, int> z : now)
			nnow.push_back({z.first, k - z.second});
		ans += cnt[nnow];//能和这个数凑对的个数
		cnt[now]++;
	}
	cout << ans;
	return 0;
}