質問の意味:ポータル
ソリューション:数値が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)} * \ dotsp1(k ∗ c n t1)∗p2(k ∗ c n t2)∗p2(k ∗ c n t2)∗…ここでcnticnt_ic n t私負でない数でなければならないので、2つの数を掛け合わせることを検討してください。1つの数を素因数で分解すると、素因数はkkになります。kの倍数を補う必要はありませんが、十分なkkではありません。kkに到達するには、 kに2以外の数を掛ける必要があります。kの倍数の場合、これらの数は2つの数として再検討され、そのうちの1つはkkの素因数です。kの倍数を削除すると、実際に機能するものが残り、構成する必要のある数も記録されます。
#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;
}