zoukankan      html  css  js  c++  java
  • D-Power Products

    题目连接:

    题解:

    根据题目的意思,对每个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;
    }
  • 相关阅读:
    浅谈代理
    AFN
    网络请求
    Socket
    几种加密方式
    8种传值方式
    swift属性观察者机智
    Swift 字符串的分割
    Xcode 所有版本
    Error Domain=ALAssetsLibraryErrorDomain Code=-3310 "数据不可用" .......
  • 原文地址:https://www.cnblogs.com/Accepting/p/11761238.html
Copyright © 2011-2022 走看看