(Technocup 2020エリミネーションラウンド2に基づいてディビジョン2、)#596 D.パワープロダクト数学ラウンドCodeforces暴力

D.パワー製品

あなたは、nは正の整数A1、...、と、整数≧2を与えられています。その結果1≤i<j≤n、jはIペアの数をカウントし、整数Xようai⋅aj= XKが存在します。

入力

最初の行は二つの整数nとk(2≤n≤105、2≤k≤100)を含みます。

2行目は、n個の整数のA1、...、(1≤ai≤105)が含まれています。

出力

適したペアの数 - 単一の整数を出力します。

入力
6 3
1 3 9 8 24 1
出力
5

注意

サンプルの場合、適切なペアは、次のとおり

a1⋅a4= 8 = 23。
a1⋅a6= 1 = 13。
a2⋅a3= 27 = 33。
a3⋅a5= 216 = 63;
a4⋅a6= 8 = 23。

問題の意味

題名ので、短い私は怠け者とそれを翻訳しないでください。

問題の解決策

まず、素因数分解、数の各因子の数2つの数の素因数分解は、その解けるkの倍数、ある場合。

それでは、次に、ベクトル、外出先を使用し、あるペアを見つけ、それぞれの素因数にそれを打破しましょう。

コード

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
int n,k;
int a[maxn];
map<vector<pair<int,int> >,int>H;
int main(){
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    long long ans = 0;
    for(int i=0;i<n;i++){
        string tmp="";
        vector<pair<int,int> >fac;
        for(int now=2;now*now<=a[i];now++){
            int number=0;
            while(a[i]%now==0){
                a[i]/=now;
                number+=1;
            }
            if(number%k)
                fac.push_back(make_pair(now,number%k));
        }
        if(a[i]>1)fac.push_back(make_pair(a[i],1%k));
        vector<pair<int,int> >fac2;
        for(int j=0;j<fac.size();j++){
            fac2.push_back(make_pair(fac[j].first,k-fac[j].second));
        }
        ans+=H[fac2];
        H[fac]++;
    }
    cout<<ans<<endl;
}

おすすめ

転載: www.cnblogs.com/qscqesze/p/11774771.html