1225D Power Products(質因數分解的變形應用)

題意:傳送門
題解:這樣考慮,如果一個數是xkx^k的形式,那麼質因數分解完成後,肯定是p1(kcnt1)p2(kcnt2)p2(kcnt2)p_1^{(k*cnt_1)}*p_2^{(k*cnt_2)}*p_2^{(k*cnt_2)}*\dots其中cnticnt_i一定是個非負數,那麼考慮兩個數相乘起來,其中一個數進行質因數分解後,質因子上是kk的倍數的是不用彌補的,反而那些不夠kk的需要進行與兩外一個數乘起來進行彌補來達到kk的倍數,那麼就將這些數重新考慮爲兩個數,其中一個就是將質因子爲kk的倍數的去除,留下實際起作用的,同時也記錄它需要什麼數進行彌補。

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章