1225Dパワープロダクツ(素因数分解の変形アプリケーション)

質問の意味:ポータル
ソリューション:数値が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)} * \ dotsp1k c n t1p2k c n t2p2k 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;
}

おすすめ

転載: blog.csdn.net/zhouzi2018/article/details/102860955