题目链接
思路:由唯一分解定理我们可知,对于一个数a【i】要满足条件的话,a【j】和a【i】必须含有相同的质因子,同时相同质因子的指数和必须是k的倍数才行,一开始想复杂了,想把质因子分开存一个个枚举,其实不用那么麻烦,用map记录一下前面满足条件的1~i-1的质因子数组。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+1;
typedef long long ll;
vector<pair<int,int>>v;
map<vector<pair<int,int>>,int>p;
int n,k,t,num;
ll ans;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)
{
v.clear();
scanf("%d",&t);
v.push_back({1,1});
int temp=t;
for(int j=2;j<=sqrt(temp);++j)//质因数分解
{
num=0;
while(t%j==0) t/=j,num++;
num%=k;
if(num!=0) v.push_back({j,num});
}
if(t!=1) v.push_back({t,1});
ans+=p[v];
for(int j=1;j<v.size();++j) v[j].second=k-v[j].second;
p[v]++;
}
printf("%lld\n",ans);
}