질문 의미 : 포털
솔루션 : 숫자가 xkx ^ k 인 경우이 방법을 고려하십시오.엑스k 형식 에서는 소인수 분해가 완료된 후p 1 (k ∗ cnt 1) ∗ p 2 (k ∗ cnt 2) ∗ p 2 (k ∗ cnt 2) ∗… p_1 ^ {( k * cnt_1)} * p_2 ^ {(k * cnt_2)} * p_2 ^ {(k * cnt_2)} * \ dots피1( k * c n t(1))∗피2( k * c n t이)∗피2( k * c n t이)∗… 여기서cnti cnt_ic n t나는음수가 아닌 숫자 여야하며 두 숫자를 곱하는 것을 고려하십시오. 하나의 숫자를 소인수로 분해 한 후 소인수는 kk입니다.k 의 배수를 보충 할 필요는 없지만 충분하지 않은kkkk에 도달하려면 k 에 2를 제외한 숫자를 곱해야합니다.k 이 숫자의 배수는 두 개의 숫자로 재검토되며, 그중 하나는 품질 계수입니다kkk 의 배수를 제거하면 실제로 작동하는 것이 남고 구성해야하는 숫자도 기록됩니다.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
ll n,k,a[N],b[N];
map<ll,ll>mp;
ll qpow(ll a,ll b){
ll ans=1ll;for(ll i=b;i;i>>=1,a=a*a)if(i&1)ans=ans*a;return ans;}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
ll now=1,need=1;
for(int j=2;j<=sqrt(a[i]);j++){
int cnt=0;
if(a[i]%j==0){
while(a[i]%j==0)a[i]/=j,cnt++;
}
cnt%=k;
now=now*qpow(j,cnt);
if(cnt!=0)need=need*qpow(j,k-cnt);
}
if(a[i]!=1){
now=now*a[i];need=need*qpow(a[i],k-1);
}
a[i]=now;b[i]=need;
mp[a[i]]++;
}
ll ans=0;
for(int i=1;i<=n;i++){
if(a[i]==b[i])ans+=mp[a[i]]-1;
else ans+=mp[b[i]];
}
printf("%lld\n",ans/2);
return 0;
}