YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目连接:

题解:

根据题目的意思,对每个X进行质因子分解,保存其质因子以及质因子出现的个数,如果两个数的乘积变成一个数的K次幂,那么两个数的质因子的指数之间相加应为k的倍数。保存完毕后,开始遍历,将与其互补的质因子与指数保存一下

。然后查找,这里需要借用STL里map嵌套vector,即map<vector<stu >,int >mp;还要定义一个结构体用来保存质因子与其指数。最后一步是查找,直接用我们mp[v1],其中V1是我们刚才保存好与该互补的一方。


,

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
struct stu{
    ll a,b;
    bool friend operator < (const stu &x, const stu &y){
        if(x.a!=y.a) return x.a>y.a;
        return x.b>y.b;
    }
};

vector<stu> ve,v1;
map< vector<stu > ,ll >mp;
ll ans=0;

void prime(ll x){
    
    ve.clear();
    v1.clear();    
    stu a1,a2;
    ll x1=x;
    
    for(ll i=2;i<=sqrt(x1);i++){
        ll s=0;
        if(x1%i==0){
            while(x1%i==0){
                x1/=i;
                s++;
            }
            a1.a=i;
            a1.b=s%k;
        }
        if(s%k)    ve.push_back(a1);//如果为k的倍数的话,就没必要保存了,因为这里的质因子i的指数不需要互补 
    }
    
    if(x1!=1)    ve.push_back({x1,1});
    sort(ve.begin(),ve.end());
    for(int i=0;i<ve.size();i++){
        ll dx=ve[i].a;
        ll dy=ve[i].b;
        if((k-dy)%k) v1.push_back({dx,(k-dy)%k});
    }
    sort(v1.begin(),v1.end());
    ans+=mp[v1];
    mp[ve]++;
}

int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        ll x;
        cin>>x;
        prime(x);
    }
    cout<<ans<<endl;
    return 0;
}

 

posted on 2019-10-29 20:14  Target--fly  阅读(267)  评论(0编辑  收藏  举报